简述
工厂方法(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');