详解PHP设计模式之工厂方法模式

简述

工厂方法(Factory Method)模式也是一种创建型设计模式,工厂模式就是要创建“某种东西”。对于工厂方法模式,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。也可以换种方式考虑,利用工厂方法模式,请求者只发出请求,而不具体创建产品。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

使用场景

工厂方法模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂方法类创建对象,而不直接使用 new。这样,如果您想要更改是所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。比方说我们在网站上给用户制定一些任务让用户完成,不同的任务我们会创建不同的类,当用户完成某个任务的时候,会给用户一些对应的奖励,这个时候如果我们任务的类型比较多,那么我们可以采用工厂模式。

简单的例子

<?php

/**
 * =======================================
 * Created by ZHIHUA·WEI.
 * Author: ZHIHUA·WEI
 * Date: 2018/7/25
 * Time: 10:06
 * Project: 详解PHP设计模式
 * Power: 工厂方法模式
 * =======================================
 */

header("Content-type:text/html;charset=utf-8");

/**
 * Class FactoryMethod
 * 工厂方法类
 */
class FactoryMethod
{
    //任务列表的类数组
    private $_arrClass = array();
    //定义一个私有的静态变量,给生成实例的静态方法使用
    private static $_obj = null;

    //初始化任务类数组,前面是key,对应真正的类名
    private function __construct()
    {
        //任务1
        $this->addClass('task1', 'Task1');
        //任务2
        $this->addClass('task2', 'Task2');
        //任务3
        $this->addClass('task3', 'Task3');
        //任务4
        $this->addClass('task4', 'Task4');
    }

    //创建类的动作,定义为静态
    public static function factory($tClass)
    {
        if (self::$_obj == null) {
            self::$_obj = new self();
        }
        if (!isset(self::$_obj->_arrClass[$tClass])) {
            //如果类不存在,返回false
            return false;
        } else {
            //类存在则生成实例
            $strClassName = self::$_obj->_arrClass[$tClass];
        }
        $ret = new $strClassName();
        //这里Task_Base_Abstract是一个任务类的抽象类,定义了一些任务共有方法
        //比方说任务完成进度,做任务等方法
        if ($ret instanceof Task_Base_Abstract) {
            //确认实例对象生成,则返回实例
            return $ret;
        } else {
            //失败则返回false
            return false;
        }
    }

    //往数组里添加任务类,初始化时用
    private function addClass($name, $RealName)
    {
        $this->_arrClass[$name] = $RealName;
    }
}

/**
 * Class Task1
 * 任务1类
 */
class Task1
{
    public function __construct()
    {
        echo "任务1";
    }
}

/**
 * Class Task2
 * 任务2类
 */
class Task2
{
}

//......

$objTask = FactoryMethod::factory('task1');

猜你喜欢

转载自blog.csdn.net/Zhihua_W/article/details/81197026
今日推荐