Factory and AbstractFactory——抽象与具体的分离
面向对象标准关注于抽取一系列事物的共同行为,组建一个基类。行为再划分成两类:
1:现在及以后不太可能会变化的行为。
2:以后可扩展的行为。
图1中,创建产品属于具体行为,类Factory除了创建产品接口外,还包含了一堆抽象特性。Factory应当包含有创建产品这个行为,但不应该指明具体创建哪个产品(产品可以无限制增加,但是创建行为只有一个)。因此,应当把创建产品这个接口保留(对行为的二次抽象),具体创建哪个产品应当由具体Factory类实现。
基于上述分析,得到修改后的图2,如下所示:
图2和图1的区别在于,把Factory提升到抽象类的高度,具体实现由ConcreteFactory实现。这样,以后对产品的扩展中,只需要修改ConcreteFactory类即可,完全不用修改抽象特性。
这种“分而治之”带来的好处,是管理上的清晰便捷,便于代码的维护和扩展。
由于产品特性各有不同(如自行车和糖果),所有产品继承自一个基类不太现实。对图2进行泛化,得到AbstractFactory模式,如图3所示:
图3与图2的差别在于,图3是多重映射关系。图3有多个ConcreteFactory,对应着多组Product。AbstractFactory模式通常由Factory实现。
参考书:C++设计模式,HeadFirst设计模式