当前位置: 移动技术网 > IT编程>软件设计>设计模式 > PHP设计模式—工厂模式之简单工厂模式

PHP设计模式—工厂模式之简单工厂模式

2020年03月22日  | 移动技术网IT编程  | 我要评论

 

定义:

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

 

代码实例:

问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 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 format
appointment data encoded in megacal format

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

 

总结:

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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网