介绍

  静态工厂模式又叫做简单工厂模式,工厂模式是最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,其核心用法就是根据不同的参数获得不同类的方法就是其设计思想.

优缺点

优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以.
  2. 扩展性高,新增加一个产品,只要扩展一个工厂类就可以.
  3. 屏蔽产品的具体实现,调用者只关心产品的接口.
  4. 修改类名,只需修改工厂模式里的类名即可.

缺点

  工厂模式缺点是违反了高内聚原则,将全部逻辑都集中在一个工厂类中.当需要添加新的类,就要改变工厂类,增加了系统的复杂度,对于维护不利,同时也增加了系统具体类的依赖.

演示

创建接口

// 定义英灵从者接口
interface Servant
{
    // 防御
    function Defense($servant);

    // 攻击
    function Attack($servant);

    // 撤退
    function Retreat($servant);
}

创建接口实现类

// 定义saber类 实现英灵接口
class Saber implements Servant
{
    public function __construct()
    {
        echo 'Servant ' . __CLASS__ . ' 遵从召唤而来' . PHP_EOL;
    }

    public function Defense($servant)
    {
        echo 'Servant ' . $servant . '进入防御状态' . PHP_EOL;
    }

    public function Attack($servant)
    {
        echo 'Servant ' . $servant . '使用剑发起攻击' . PHP_EOL;
    }

    function Retreat($servant)
    {
        echo 'Servant ' . $servant . '开始撤退' . PHP_EOL;
    }
}

// 定义Archer类 实现英灵接口
class Archer implements Servant
{
    public function __construct()
    {
        echo 'Servant ' . __CLASS__ . ' 遵从召唤而来' . PHP_EOL;
    }

    public function Defense($servant)
    {
        echo 'Servant ' . $servant . '进入防御状态' . PHP_EOL;
    }

    public function Attack($servant)
    {
        echo 'Servant ' . $servant . '使用弓箭发起攻击' . PHP_EOL;
    }

    function Retreat($servant)
    {
        echo 'Servant ' . $servant . '开始撤退' . PHP_EOL;
    }
}

// 定义Fail类 实现英灵接口
class Fail implements Servant
{
    public function __construct()
    {
        echo 'Servant 召唤失败' . PHP_EOL;
    }

    public function Defense($servant)
    {
        echo '未召唤成功' . PHP_EOL;
    }

    public function Attack($servant)
    {
        echo '未召唤成功' . PHP_EOL;
    }

    function Retreat($servant)
    {
        echo '未召唤成功' . PHP_EOL;
    }
}

创建工厂

// 创建工厂
class Factory
{
    static public function factor($type)
    {
          // 首字母大写
        $type = ucfirst($type);
        // 判断类是否存在
        if(class_exists($type)){
            return new $type;
        }
        return new Fail();
    }
}

演示

// 调用测试
Factory::factor('saber')->Attack('兰斯洛特');
Factory::factor('Lancer')->Attack('斯卡哈');
// 执行输出
Servant Saber 遵从召唤而来
Servant 兰斯洛特使用剑发起攻击
Servant 召唤失败
未召唤成功
Last modification:March 7th, 2020 at 12:05 am