开发者社区> 好1234> 正文

PHP设计模式——工厂方法

简介:   声明:本系列博客参考资料《大话设计模式》,作者程杰。              前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。            具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
+关注继续查看

  声明:本系列博客参考资料《大话设计模式》,作者程杰。


             前面我们介绍了简单工厂,今天我们继续学习另外一个工厂——工厂方法。

  

        具体案例:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我们一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

        工厂方法模式核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,如下图:


    工厂方式模式主要由以下几种角色组成:

        抽象工厂角色(IServerFactory):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

       具体工厂角色(ChickenLegBaoFactory):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

         抽象产品角色(IHanbao):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

         具体产品角色(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.管理上的难度

          假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。


欢迎关注我的视频课程,地址如下,谢谢。


   PHP面向对象设计模式

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP升级方法之一
yum配置 执行命令下载、安装yum源,当前是针对Centos6并且64位版本的源: [root@T_249 yum.repos.
675 0
设计模式之三(工厂方法模式)
原文:设计模式之三(工厂方法模式) 前言 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。 简单工厂模式(http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html)的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
813 0
php cli模式下获取参数的方法
  PHP在cli模式下接收参数有两种方法   1.使用argv数组   2.使用getopt方法   1.使用argv数组
1242 0
反射与工厂设计模式 | 带你学《Java语言高级特性》之八十三
通过案例逐步掌握工厂设计模式,通过工厂类获取指定接口的实例化对象。
859 0
[设计模式]工厂方法模式
简介 工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。  工厂模式是一种类创建型模式 (可参考 设计模式 创建型模式)。
732 0
设计模式 抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
610 0
+关注
好1234
在PHP技术圈摸爬滚打四五载,经历了高并发、大数据项目的各种坑,不断的在坑中打磨成长。热衷技术领域:Yii2 、 Mysql 、Redis 、ElasticSearch 、Nginx、设计模式、分布式存储、分布式编程,对面向对象编程有比较独到的见解,重视团队协作。
96
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载