php抽象工厂模式

来源:互联网 发布:中电四公司知乎 编辑:程序博客网 时间:2024/06/08 12:28
抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,在学习什么是抽象工厂模式之前,需要对“工厂方法模式”有一定的了解,可以点击链接【php工厂方法模式】查看进行了解。
个人理解:
如果说“工厂方法模式”是针对的是一个产品等级结构,那么,抽象工厂方法则是针对的多个产品等级结构。
引用前辈资料进行解释如下:

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。
明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。
1 类的实现
代码示例:
# 定义一个抽象工厂接口AnimalFactory
interface AnimalFactory {          public function createCat();# 创建方法1   createCat        public function createDog();# 创建方法2   createDog            }  
# 定义一个具体的工厂BlackAnimalFactory 其中实现了接口的两个方法createCat、createDog
class BlackAnimalFactory implements AnimalFactory {      # 方法1      function createCat(){          return new BlackCat();      }      # 方法2     function createDog(){          return new BlackDog();        }  }
# 定义另一个具体的工厂WhiteAnimalFactory 其中实现了接口的两个方法createCat、createDog
class WhiteAnimalFactory implements AnimalFactory {      # 方法1       function createCat(){          return new WhiteCat();      }      # 方法2    function createDog(){          return new WhiteDog();      }  } 
到这里我们就已经可以看出来,该示例与工厂方法模式的区别了,黑猫和白猫属于同一个等级结构黑狗和白狗属于同一个等级结构,显而易见出现了两个等级结构,所以它不是工厂方法模式而是抽象工厂模式,这也是两者的区别之处。
我们继续看代码:
# 定义两个抽象的产品接口
interface Cat {      function Voice();  }    interface Dog {      function Voice();     }
# 定义具体的产品角色
class BlackCat implements Cat {        # 角色1    function Voice(){          echo '我是一只黑猫';      }  }  class WhiteCat implements Cat {        # 角色2    function Voice(){          echo '我是一只白猫';      }  }  class BlackDog implements Dog {        # 角色3    function Voice(){          echo '我是一只黑狗';      }  }  class WhiteDog implements Dog {       # 角色4    function Voice(){          echo '我是一只白狗';      }  }  

# 定义一个访问

class Client {public static function main(){self::voice(new BlackAnimalFactory);self::voice(new WhiteAnimalFactory);}private static function voice($AnimalFactory){$cat = $AnimalFactory->createCat();                  $cat->Voice();          echo '<br>';          $dog = $AnimalFactory->createDog();          $dog->Voice(); echo '<br>';  }}

# 输出看一下
Client::main();
# 结果
我是一只黑猫我是一只黑狗我是一只白猫我是一只白狗
2 结论
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
3 特点
优点:
1、具备工厂方法的所有优点
2、可以在类的内部对产品族进行约束(所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。)
缺点:
产品族的扩展将会很麻烦,因为新增一个产品,则几乎所有的工厂类都需要进行修改。

更多设计模式文章请点击下面链接:
【设计模式概述】http://blog.csdn.net/bk_guo/article/details/73828064
【简单工厂模式】http://blog.csdn.net/bk_guo/article/details/73849317
【单例模式】http://blog.csdn.net/bk_guo/article/details/73845244
【工厂方法模式】http://blog.csdn.net/bk_guo/article/details/73896262

原创粉丝点击