时间: 2020-09-4|tag: 43次围观|0 条评论

 

定义:

简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。

 

代码实例:

问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointment 对象,现在需要通过一种称为 BloggsCal 的格式进行预约数据的交互。后面可能还需要处理更多的数据格式,比如 MegaCal 格式。

1、创建一个抽象类 ApptEncoder

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

2、创建 BloggsCal 格式处理类

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

3、创建 MegaCal 格式处理类

/** * MegaCal 格式处理类 * Class MegaApptEncoder */class MegaApptEncoder extends ApptEncoder{    public function encode()    {        // TODO: Implement encode() method.        return "Appointment data encoded in MegaCal format\n";    }}

4、创建工厂类 CommsManager

/** * 工厂类 * Class CommsManager */class CommsManager{    const BLOGGS = 1;    const MEGA = 2;    private $model;    /**     * CommsManager constructor.     * @param $model     */    public function __construct($model)    {        $this->model = $model;    }    /**     * 通过工厂去选择需要实例化的对象     */    public function getApptEncoder()    {        switch ($this->model) {            case (self::BLOGGS):                return new BloggsApptEncoder();            default:                return new MegaApptEncoder();        }    }}

5、调用:

$man = new CommsManager(CommsManager::BLOGGS);print $man->getApptEncoder()->encode();$man = new CommsManager(CommsManager::MEGA);print $man->getApptEncoder()->encode();

6、结果:

Appointment data encoded in BloggsCal formatAppointment data encoded in MegaCal format

如果后面需要新增一种格式处理,则需要新增一个相应的格式处理类,再到工厂类中增加相应的实例化调用就可以了。

 

总结:

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但刚才也说了,如果新增一种格式处理,是要修改工厂类的。这就等于说,我们不但对扩展开放了,对修改也开放了,因此违背了“开放-封闭原则”。这时可以使用工厂方法模式。

 

文章转载于:https://www.cnblogs.com/woods1815/p/12545603.html

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《PHP设计模式—工厂模式之简单工厂模式
   

还没有人抢沙发呢~