设计模式之-创建型模式-简单工厂模式 (Simple Factory Pattern)


简单工厂模式 (Simple Factory Pattern)


1. 模式定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的接口或父类。

2. 模式结构

简单工厂模式包含如下角色:

  • Factory:工厂

    • 工厂负责实现创建所需类的实例
  • AbstractProduct: 抽象产品

    • 抽象产品是所有具体产品类的父类
  • ConcreteProduct:具体产品

    • 具体产品是创建目标

3. 示例

以一个简单的计算器功能来说明下各角色的应用:

  • OperationFactory.php:工厂
/**
 * 运算工厂类
 * 一、根据不同的参数来创建加法、减法类等实例。
 * 二、通常createOperate方法为公开的静态方法。
 * 三、通常createOperate方法中包含简单的switch...case判断逻辑。
 *
 * @author    <dendi875@163.com>
 * @createDate 2018-03-08 20:03:21
 * @copyright Copyright (c) 2017 dendi875@163.com
 */

class OperationFactory
{
    public static function createOperate($operate)
    {
        $operation = null;
        switch ((string)$operate) {
            case '+':
                $operation = new OperationAdd();
                break;
            case '-':
                $operation = new OperationSub();
                break;
        }
        return $operation;
    }
}
  • Operation.php:抽象产品
/**
 * 运算抽象类
 *
 * @author    <dendi875@163.com>
 * @createDate 2018-03-08 20:00:07
 * @copyright Copyright (c) 2017 dendi875@163.com
 */

abstract class Operation
{
    protected $numberA;

    protected $numberB;

    abstract protected function getResult();

    public function setNumberA($numberA)
    {
        $this->numberA = $numberA;
    }

    public function getNumberA()
    {
        return $this->numberA;
    }

    public function setNumberB($numberB)
    {
        $this->numberB = $numberB;
    }

    public function getNumberB()
    {
        return $this->numberB;
    }
}
  • OperationAdd.php、OperationSub.php:具体产品
/**
 * 加法运算类
 *
 * @author    <dendi875@163.com>
 * @createDate 2018-03-08 20:02:42
 * @copyright Copyright (c) 2017 dendi875@163.com
 */

class OperationAdd extends Operation
{
    public function getResult()
    {
        return bcadd($this->numberA, $this->numberB, 2);
    }
}

/**
 * 减法运算类
 *
 * @author    <dendi875@163.com>
 * @createDate 2018-03-08 20:03:01
 * @copyright Copyright (c) 2017 dendi875@163.com
 */

class OperationSub extends Operation
{
    public function getResult()
    {
        return bcsub($this->numberA, $this->numberB, 2);
    }
}

4. 客户端的使用

$operation = OperationFactory::createOperate('+');
$operation->setNumberA(2000.30);
$operation->setNumberB(299.40);
$result = $operation->getResult();

5. UML类图

简单工厂模式实现的计算器示例代码UML图:

SimpleFactoryPattern-0

6. 简单工厂模式的优点

  • 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
  • 客户端无须知道所创建产品类的类名,只需要知道具体产品类所对应的参数,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量

7. 简单工厂模式的缺点

  • 使用简单工厂模式将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。
  • 在产品类型较多时,有可能造成工厂类逻辑过于复杂,不利于系统的扩展和维护。
  • 一旦添加新的产品就不得不修改工厂类逻辑,在工厂类的方法中增加“Case”条件分支,修改了原生的类,这就违背了开放-封闭原则

8. 适用场景

以下情况可以使用简单工厂模式:

  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只关心传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道各产品类所对应的参数。

文章作者: 张权
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张权 !
评论
  目录