Factory and AbstractFactory——抽象与具体的分离

面向对象标准关注于抽取一系列事物的共同行为,组建一个基类。行为再划分成两类:

   1:现在及以后不太可能会变化的行为。

   2:以后可扩展的行为。

Factory and AbstractFactory  ——抽象与具体的分离-LMLPHP

   图1中,创建产品属于具体行为,类Factory除了创建产品接口外,还包含了一堆抽象特性。Factory应当包含有创建产品这个行为,但不应该指明具体创建哪个产品(产品可以无限制增加,但是创建行为只有一个)。因此,应当把创建产品这个接口保留(对行为的二次抽象),具体创建哪个产品应当由具体Factory类实现。

基于上述分析,得到修改后的图2,如下所示:

Factory and AbstractFactory  ——抽象与具体的分离-LMLPHP

   图2和图1的区别在于,把Factory提升到抽象类的高度,具体实现由ConcreteFactory实现。这样,以后对产品的扩展中,只需要修改ConcreteFactory类即可,完全不用修改抽象特性。

这种“分而治之”带来的好处,是管理上的清晰便捷,便于代码的维护和扩展。

由于产品特性各有不同(如自行车和糖果),所有产品继承自一个基类不太现实。对图2进行泛化,得到AbstractFactory模式,如图3所示:

Factory and AbstractFactory  ——抽象与具体的分离-LMLPHP

图3与图2的差别在于,图3是多重映射关系。图3有多个ConcreteFactory,对应着多组Product。AbstractFactory模式通常由Factory实现。

参考书:C++设计模式,HeadFirst设计模式

05-11 13:58