声明:本系列博客参考资料《大话设计模式》,作者程杰。
前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。
抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品角色(ChickenLegBao):这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
根据以上UML类图和角色编写以下PHP代码:
<?php /** * Created by PhpStorm. * User: Jiang * Date: 2015/4/16 * Time: 22:12 */ /**抽象产品角色 汉堡 * Interface IHanbao */ interface IHanbao { function Allay(); } /**具体产品角色 肉松汉堡 * Class RouSongBao */ class RouSongBao implements IHanbao { function Allay() { echo "I am 肉松汉堡,小的给主人解饿了!<br/>"; } } /**鸡肉汉堡 * Class ChickenBao */ class ChickenBao implements IHanbao { function Allay() { echo "I am 鸡肉汉堡,小的给主人解饿了!<br/>"; } } /**抽象工厂角色 * Interface IServerFactory */ interface IServerFactory { function MakeHanbao(); } /**具体工厂角色 肉松汉堡工厂 * Class RouSongFactory */ class RouSongFactory implements IServerFactory { function MakeHanbao() { return new RouSongBao(); } } class ChickenFactory implements IServerFactory { function MakeHanbao() { return new ChickenBao(); } }
header("Content-Type:text/html;charset=utf-8"); //------------------------工厂方式测试代码------------------ require_once "./FactoryMethod/FactoryMethod.php"; //-----------------餐厅厨师----------- $chickenFactory=new ChickenFactory(); $rouSongFactory=new RouSongFactory(); //-----------点餐------------ $chicken1=$chickenFactory->MakeHanbao(); $chicken2=$chickenFactory->MakeHanbao(); $rouSong1=$rouSongFactory->MakeHanbao(); $rouSong2=$rouSongFactory->MakeHanbao(); //------------------顾客吃饭--------- $chicken1->Allay(); $chicken2->Allay(); $rouSong1->Allay(); $rouSong2->Allay();
工厂方法模式优缺点:
优势:克服了简单工厂模式违背开放-封闭的原则,保持了封装对象创建过程的优点。
简单工厂模式与工厂方法模式的比较:
1. 结构复杂度
2.代码复杂度
3.管理上的难度
假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。
原文地址:http://blog.csdn.net/jhq0113/article/details/45082119