定义
定义一个工厂类,可以根据参数不同返回不同的实例。这些实例继承同一个父类。由于工厂类中创建实例的方法是静态方法, 所以工厂方法也被称为静态工厂方法, 是类创建型模式。不属于GOF23中设计模式。
UML类图
伪代码
/**
* 工厂类
*/
class OperateFactory
{
public static function getOperateInstance($type)
{
$operate = null;
switch ($type) {
case '+':
$operate = new AddOperate();
break;
case '-':
$operate = new ReduceOperate();
break;
case '*':
$operate = new Division();
break;
case '/':
$operate = new Multiply();
break;
default:
throw new \Exception("Not exists type#{$type}");
}
return $operate;
}
}
/**
* 工厂父类
*/
abstract class BaseOperate
{
abstract function caculate();
public function __set($name, $value)
{
$this->$name = $value;
}
public function __get($name)
{
if (isset($this->$name)) {
return $this->$name;
}
throw new \Exception("not exist param {$name}");
}
}
/**
* 加法实例
*/
class AddOperate extends BaseOperate
{
public function caculate()
{
return $this->numberA + $this->numberB;
}
}
/**
* 减法实例
*/
class ReduceOperate extends BaseOperate
{
public function caculate()
{
return $this->numberA - $this->numberB;
}
}
/**
* Client
*/
spl_autoload_register('auto_load_class', true, true);
$operate = '+';
$instance = OperateFactory::getOperateInstance($operate);
$instance->numberA = 20;
$instance->numberB = 10;
$result = $instance->caculate();
var_dump($result);
function auto_load_class($class)
{
require_once "./{$class}.php";
}
优缺点
优点:
1.客户端可以不需要记住复杂的类名就可以创建相应的实例
缺点:
1.工厂类中如果新增一个新的实例,就需要添加相应的判断,违反了开闭原则
2. 工厂类是通过静态方法获取, 不便于层级扩展
使用场景
1.适用于工厂需要创建的情况不多的情况。
2. 用于创建对象