(一)工厂模式

一、简单工厂模式

1、名称:简单工厂模式

2、结构:(1)提供静态接口的工厂类 (2)抽象产品类 (3)继承自抽象产品类的具体产品类 

3、动机:封装产品创建的具体过程,对外只提供一个统一的创建产品对象的接口,内部通过业务和逻辑来辨别具体创建哪种具体产品类的对象。

4、优点:简单,容易理解。

5、缺点:根据开闭原则(对扩充开放,对修改封闭),不利于产品的扩充。在出现新产品的情况时,在工厂类中必须新增相应的业务和逻辑判断来维护新产品的创建接口,使工厂类比较被动。

6、使用条件:产品比较稳定,不会频繁的增加新产品的情况下,可以使用简单工厂模式。

7、理解与分析: 简单工厂模式这个名称对理解此模式的结构和使用条件不是非常清晰,想不明白为什么叫”简单工厂”。我更喜欢把它理解为“全能工厂”或者“超级工厂”。在一个工厂内能够生产工厂现阶段能生产的所有产品,虽然此工厂比较“全能”,但它不专业,当有新产品发明出来后,必须对工厂进行改造和技术革新才能生产新产品。有“全能型”的工厂,那么也会有“专业型”的工厂,那就是“工厂方法模式”。

 

二、 工厂方法模式

1、名称:工厂方法模式

2、结构:(1)抽象工厂类 (2)具体工厂类 (3)抽象产品类 (4)具体产品类

3、动机:创建单一型产品。

4、优点:特定的产品由特定的工厂创建,两者为一对一关系,结构清晰利于扩充和维护。  

5、缺点:如果有大量的新产品,那么工厂类和产品类的数量将成倍的增长,这不是我们所希望的。

6、使用条件:产品更新比较频繁,但是产品类别数量不是很大的情况下,可以使用工厂方法模式。

7、理解与分析:相应于“简单工厂”叫“全能工厂”,我把“工厂方法”也理解为“专业工厂”,一个工厂只生产一种产品,要的就是专业。拿现实的工厂来举例,一类工厂什么都能生产,这类工厂遇到新产品时必须停产进行技术革新升级后才能投入使用;而另一类工厂只能生产一种产品,当有新产品研发出来后就开设分厂进行生产,然后随时产品越来越多,分厂也越来越多,最后管理跟不上了。两者各有利弊,那么如何取其精华去其糟粕呢,这就有了“全能工厂”与“专业工厂”的综合性工厂-“工厂生产线”。

 

三、工厂生产线模式

1、名称:工厂生产线模式

2、结构: (1)提供静态接口的工厂类 (2)提供生产线接口 (3)抽象产品类 (4)具体产品类

3、动机:取简单工厂的简单易维护,去工厂方法模式的单一化。

4、优点:动态的新增和删除产品创建功能

5、缺点:结构比较负责,需要语言功能支持,通用性不强。

6、原型:

(1)工厂生产线类

 1 public class FactoryAssembly  

 2     {
 3         public delegate Car Assemble();
 4         private static Dictionary<Type, Assemble> list = new Dictionary<Type, Assemble>();
 5 
 6         public static void Add(Type type, Assemble method)
 7         {
 8             list.Add(type, method);
 9         }
10 
11         public static bool Remove(Type type)
12         {
13             return list.Remove(type);
14         }
15 
16         public static Car Produce(Type type)
17         {
18             Assemble method = list[type];
19             if (method != null)
20             {
21                 return method();
22             }
23             return null;
24         }
25     }

(2)产品类

 1 public abstract class Car  

 2     {
 3         public abstract void Drive();
 4     }
 5 
 6     public class BenzCar : Car
 7     {
 8         public override void Drive()
 9         {
10             System.Console.WriteLine("you drive a benz car");
11         }
12     }
13 
14     public class BMWCar : Car
15     {
16         public override void Drive()
17         {
18             System.Console.WriteLine("you drive a bmw car");
19         }
20     }
21 
22     public class AudiCar : Car
23     {
24         public override void Drive()
25         {
26             System.Console.WriteLine("you drive a audi car");
27         }
28     }

(3)实现代码

 1 FactoryAssembly.Add(typeof(BenzCar), new FactoryAssembly.Assemble(delegate()
 2             {
 3                 return new BenzCar();
 4             }));
 5             FactoryAssembly.Add(typeof(BMWCar), new FactoryAssembly.Assemble(delegate()
 6             {
 7                 return new BMWCar();
 8             }));
 9             FactoryAssembly.Add(typeof(AudiCar), new FactoryAssembly.Assemble(delegate()
10             {
11                 return new AudiCar();
12             }));
13             FactoryAssembly.Produce(typeof(BenzCar)).Drive();
14             FactoryAssembly.Produce(typeof(BMWCar)).Drive();


7、 理解与分析:此模式结合了简单工厂和工厂方法各自的优点。把创建产品的方法抽离出来,通过动态新增和删除产品生产方法使模式更强的适应性。与现实工厂相联系,就像工厂内的各生产线,把“专一工厂”的分厂模式改进为工厂流水线,一个产品一条生产线,增加新产品则增加一个生产方法,很容易理解。

 

四、抽象工厂模式

1、名称:抽象工厂模式

2、结构:(1)抽象工厂类 (2)具体工厂类 (3)抽象产品类 (4)具体产品类

3、动机:一个工厂内创建相同风格的不同产品对象。

4、优点:同一系列、同一风格的产品在同一工厂内创建有利于维护产品风格的统一性。

5、缺点:与工厂方法类似,会产生大量的工厂类和产品类,另外创建了某种新风格的产品后,必须同时创建相同风格的其他产品对象。

6、使用条件:在多个产品树之间拥有相同风格或系列的产品对象,这些产品对象称为产品族。

7、理解与分析: 抽象工厂模式致力于产品风格的统一与完整,达到高程度的系列化。

 

 

 

 

 

posted @ 2012-05-30 21:38  寒江独钓客  阅读(255)  评论(0编辑  收藏  举报