笔记 - 关于“工厂”的设计模式

放假了不能一直歇着呀,就再次翻了翻《大话设计模式》,之前看了一次感觉是囫囵吞枣,这次挑了有关“工厂”的模式进行“单元复习”,把笔记就记在这吧。

之前看过博客园有人说这本书对某些设计模式理解的其实不完全对,而我是按照这本书理解的;如果读者对我的理解有异议,欢迎留言。

简单工厂模式

类图:

SimpleFactory

 

用法:客户端利用SimpleFactory产生一个具体产品(用AbstractProduct引用),当然这需要客户端传参,但判断逻辑位于SimpleFactory中(如switch语句)。

扩展:若需要增加具体产品E,则须添加ConcreteProductE类,同时修改SimpleFactory。

修改:若需要修改具体产品A,则只需修改ConcreteProductA类。

本书例子:计算器。

工厂方法模式

类图:

FactoryMethod

 

用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。

扩展:若需要增加具体产品E,则须添加ConcreteProductE类和ConcreteFactoryE。

修改:直接修改相应产品。

本书例子:雷锋。

抽象方法模式

类图:

AbstractFactory

 

用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。相比而言,抽象工厂模式的好处是易于转换产品的系列(如由A系列转换为B系列)。

扩展:若需要增加产品3A和3B,则除了要增加3个类外还要修改FactoryA和FactoryB。若需要增加产品系列C,除了增加相应的类外,还要增加FactoryC类。

修改:直接修改相应的类。

本书例子:迁移数据库。

抽象方法模式+(与简单工厂模式结合)

类图:

AbstractFactory

 

用法:客户端不进行判断,而是在SimpleFactory中判断产生A系列还是B系列,这时客户端可能传参了,也可能没传参,SimpleFactory通过自身的字段或属性来决定A系列还是B系列。

扩展:若需要增加产品3A和3B,则除了要增加3个类外还要修改SimpleFactory。若需要增加产品系列C,则需要修改SimpleFactory内部代码(如switch语句)。

修改:直接修改相应的类。

本书例子:迁移数据库。

抽象方法模式++(与简单工厂模式结合,再使用“反射”)

在实例化产品时,选择A系列还是选择B系列其实只是类名不同,此时使用反射技术能很好地避免出现switch语句,同时使设计尽量适合“开放-封闭”原则。

大概的写法是:AbstractProduct1 product = (AbstractProductA)Assembly.Load(“AssemblyName”).CreateInstance(“AssemblyName.Product1A”);

其中,AssemblyName为程序集名称,CreateInstance的参数即我们的变量,我们可以将它存在配置文件中,这样,我们就能完全不修改程序,只修改配置文件来切换数据库类型了。

 

 

说实在的,刚刚学习设计模式,在练习时还没有养成设计模式的意识,今后要多多加强!多多练习!多多写博!

Technorati 标签: 设计模式,工厂

posted @ 2011-02-08 19:21  FrankFang  阅读(2655)  评论(15编辑  收藏  举报