简单工厂模式
工厂模式的意义:
在开发中,经常存在客户端和服务端分离开发的情况,也就是说服务端负责提供底层的一些借口,客户端这边直接调用,客户端不需要关心服务端是怎么实现的,也不需要看到服务端的代码(php是可以看到的,因为可以直接跟踪源码,而像java这边服务端是直接编译过的包,源码是无法看到的),鉴于此种情况,我们就引入了工厂模式
工厂模式图解
OperationFactory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法 createOperate(),它的返回类型为具体产品角色。
Operation(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
OperateAdd、OperateSub、OperateMul、OperateDiv(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
//抽象产品
abstract class Operation{
private $_a;
private $_b;
public function __set($name,$value){
$this->$name = $value;
}
public function __get($name){
return $this->$name;
}
abstract function getResult();
}
//具体产品(1)
class OperateAdd extends Operation{
public function getResult(){
return $this->_a + $this->_b;
}
}
//具体产品(2)
class OperateSub extends Operation{
public function getResult(){
return $this->_a - $this->_b;
}
}
//具体产品(3)
class OperateMul extends Operation{
public function getResult(){
return $this->_a * $this->_b;
}
}
//具体产品(4)
class OperateDiv extends Operation{
public function getResult(){
if($this->_b == 0){
throw new Exception('除数不能为0');
}
return $this->_a / $this->_b;
}
}
工厂角色
class OperationFactory{
public static function createOperate($operate){
switch ($operate){
case '+':
$oper = new OperateAdd();
break;
case '-':
$oper = new OperateSub();
break;
case '*':
$oper = new OperateMul();
break;
case '/':
$oper = new OperateDiv();
break;
}
return $oper;
}
}
//对于客户端来说 只需要开放工厂方法 和抽象类就可以实现功能
$oper = OperationFactory::createOperate('-');
$oper->_a = 1;
$oper->_b = 10;
$res = $oper->getResult();
var_dump($res);