在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
应用案例
<?php /* 应用例子: 制造汽车 假设我有了三种制造汽车技术.分别是car_10w类,car_50w类,car_100w类, 分别能制造3个档次的车10w,50w,100w. 我并不直接拿这3个技术去自己制造车.而且建立工厂去负责制造.---此时就是工厂模式了. 但我要建立3个厂,一个厂制造一种.分别是factory10w,factory50w,factory100w 三个工厂类. --这就是工厂方法模式. */ //汽车接口 interface car(){ public function run(); } //10万的车 class car_10w implements car{ public function run(){ echo ‘跑.......‘; } } //50万的车 class car_50w implements car(){ public function run(){ echo ‘跑.......‘; } } //100万的车 class car_100w implements car(){ public function run(){ echo ‘跑.......‘; } } //工厂接口 interface factoryCar(){ //制造汽车 static function makeCar(); } //专门制造10w级别的工厂 class factory10w implements factoryCar{ static public function makeCar(){ return car_10w(); } } //专门制造50w级别的工厂 class factory50w implements factoryCar{ static public function makeCar(){ return car_50w(); } } //专门制造100w级别的工厂 class factory100w implements factoryCar{ static public function makeCar(){ return car_100w(); } } //制造汽车 $car1= factory10w::makeCar(); $car2= factory50w::makeCar(); $car3= factory100w::makeCar(); ?>
小结
先分析一下如果上面制作汽车列子用简单工厂模式去实现,那么只会建立一个工厂去制作汽车,根据给出的指令不同,制作不同级别的汽车. 假如后期要加入别的车,那么工厂内部必须在做修改.
违反开闭原则.随着以后不断发展,工厂能做的车越来越多,又违反了功能过多原则.所以这例中用简单工厂模式是很不合适的.
再分析一下工厂方法模式,一个厂制作一种车.后期想添加其他的车,只需要在添加一个厂去生产这种车就行了(遵守开闭原则).每个工厂也能生产一种车,没其他功能.(遵守功能不要过多).
注意: 不管简单工厂模式或工厂方法模式,它们的真正意义是面向接口和隔离封装.也许你现在还不能完全体会其意义.当多个协作开发意义就明显了.
我的个人理解是: 只管使用,不管实现过程.就好比去饭馆吃饭,我只去吃.不考虑这菜是如何做的.
工厂方法(Factory Method)模式,布布扣,bubuko.com
原文:http://www.cnblogs.com/tlijian/p/3590439.html