加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP设计模式—工厂模式之工厂方法模式

发布时间:2020-12-13 21:24:00 所属栏目:PHP教程 来源:网络整理
导读:? 定义: 工厂方法模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 ? 代码实例: 这里还是接着上篇简单工厂模式的那个例子,改成工厂方法模式。 1、创建一个抽象类 ApptEncoder /* * * 抽象类 * Clas

?

定义:

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

?

代码实例:

这里还是接着上篇简单工厂模式的那个例子,改成工厂方法模式。

1、创建一个抽象类 ApptEncoder

/**
 * 抽象类
 * Class ApptEncoder
 */
abstract class ApptEncoder
{
    public function encode();
}

2、创建 BloggsCal 格式处理类

*
 * BloggsCal 格式处理类
 * Class BloggsApptEncoder
 class BloggsApptEncoder extends encode()
    {
        // TODO: Implement encode() method.
        return "Appointment data encoded in BloggsCal formatn";
    }
}

3、创建 MegaCal 格式处理类

*
 * MegaCal 格式处理类
 * Class MegaApptEncoder
 class MegaApptEncoder return "Appointment data encoded in MegaCal formatn";
    }
}

4、创建工厂抽象类 CommsManager

*
 * 工厂抽象类
 * Class CommsManager
  CommsManager
{
     getHeaderText();
     getApptEncoder();
     getFooterText();
}

5、创建 BloggsCal 工厂类

*
 * BloggsCal 工厂类
 * Class BloggsCommsManager
 class BloggsCommsManager  getHeaderText()
    {
         TODO: Implement getHeaderText() method.
        return "BloggsCal headern";
    }

     getApptEncoder()
    {
         TODO: Implement getApptEncoder() method.
        return new BloggsApptEncoder();
    }

     getFooterText()
    {
         TODO: Implement getFooterText() method.
        return "BloggsCal footern";
    }
}

6、创建 MegaCal 工厂类

*
 * MegaCal 工厂类
 * Class MegaCommsManager
 class MegaCommsManager return "MegaCal headern" MegaApptEncoder();
    }

    return "MegaCal footern";
    }
}

7、调用:

 如果要换成 MegaCal 格式处理,直接换成 $mar = new MegaCommsManager() 就可以了
$mgr =  BloggsCommsManager();
print $mgr->getHeaderText();
$mgr->getApptEncoder()->encode();
$mgr->getFooterText();

8、结果:

BloggsCal header
Appointment data encoded in BloggsCal format
BloggsCal footer

?

总结:

1、使用工厂方法模式,如果需要新增一种格式处理,就不需要修改原有的工厂类了,只需要为这些抽象类实现新的子类即可。这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这就符合了“开放-封闭原则”。
2、工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来修改工厂类,而现在是修改客户端。
3、工厂方法模式的缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读