放假了不能一直歇着呀,就再次翻了翻《大话设计模式》,之前看了一次感觉是囫囵吞枣,这次挑了有关“工厂”的模式进行“单元复习”,把笔记就记在这吧。
之前看过博客园有人说这本书对某些设计模式理解的其实不完全对,而我是按照这本书理解的;如果读者对我的理解有异议,欢迎留言。
类图:
用法:客户端利用SimpleFactory产生一个具体产品(用AbstractProduct引用),当然这需要客户端传参,但判断逻辑位于SimpleFactory中(如switch语句)。
扩展:若需要增加具体产品E,则须添加ConcreteProductE类,同时修改SimpleFactory。
修改:若需要修改具体产品A,则只需修改ConcreteProductA类。
本书例子:计算器。
类图:
用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。
扩展:若需要增加具体产品E,则须添加ConcreteProductE类和ConcreteFactoryE。
修改:直接修改相应产品。
本书例子:雷锋。
类图:
用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。相比而言,抽象工厂模式的好处是易于转换产品的系列(如由A系列转换为B系列)。
扩展:若需要增加产品3A和3B,则除了要增加3个类外还要修改FactoryA和FactoryB。若需要增加产品系列C,除了增加相应的类外,还要增加FactoryC类。
修改:直接修改相应的类。
本书例子:迁移数据库。
类图:
用法:客户端不进行判断,而是在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的参数即我们的变量,我们可以将它存在配置文件中,这样,我们就能完全不修改程序,只修改配置文件来切换数据库类型了。
说实在的,刚刚学习设计模式,在练习时还没有养成设计模式的意识,今后要多多加强!多多练习!多多写博!