关于工厂方法模式与抽象工厂模式的讨论
1. 工厂方法模式的设计与可扩展性
将工厂层次类的超类设计为一个抽象类,并且在该类中包含一个静态方法getBuildingFactory(type:String)。由客户类直接调用该方法,并且传入一个参数值。根据该参数,由工厂超类决定创建一个具体的工厂子类对象,并且返回给客户类。之后客户类利用该工厂子类对象产生产品子类的对象。如果产品类的对象的创建需要动态的由客户类提供参数,则可以在工厂子类的构造方法的参数中传入。这样做的好处是,将创建工厂类对象的条件语句交给了工厂超类。而在客户类中,不包含创建工厂子类对象的条件语句。在可扩展性方面,修改产品类的时候,不需要修改工厂类和客户类;而需要增加一个新的产品子类的时候,只需要响应的增加一个工厂子类即可,对原有的产品类代码和工厂类代码没有任何影响。当然,如果客户程序需要使用新增加类的时候,需要修改工厂超类的getBuildingFactory(type:String)方法。
2. 抽象工厂模式的设计与可扩展性
(1)如果需要增加ProductA3 和ProductB3,则工厂类阶层类需要增加ConcreteCreator3。在此情况下,抽象工厂模式符合开闭原则。
抽象工厂模式——符合开闭原则:
(2)如果要增加一个新产品层次类ProductC,则必须在每个工厂实类中增加方法+getObjC。在此情况下,抽象工厂模式不符合开闭原则。
抽象工厂模式——不符合开闭原则: