工厂方法:定义一个工厂接口,用来创建产品对象,将实际创建工作推迟到子类当中。
工厂方法来源于简单工厂模式,是简单工厂模式的一个衍生品。核心的工厂类不再进行类的实例化,核心工厂类不再负责产品的创建,核心的工厂类只负责子类的接口,使核心工厂类抽象化,成为一个抽象工厂。
工厂方法的优点:在简单工厂模式的基础上再次对核心工厂类进行抽象,在需要添加新的产品时,更好的依赖于开放-封闭原则,不需要修改具体的工厂角色即可扩展。
场景:简单计算器。以PHP为代码实现环境。
简单工厂模式:
<?php
class Calculator{
public $numberA;
public $numberB;
public $result;
public function returnResult(){
}
}
class Add extends Calculator{
public function __construct($a, $b){
$this->numberA = $a;
$this->numberB = $b;
}
public function returnResult(){
$this->result = $this->numberA + $this->numberB;
return $this->returnResult();
}
}
class Sub extends Calculator{
public function __construct($a, $b){
$this->numberA = $a;
$this->numberB = $b;
}
public function returnResult(){
$this->result = $this->numberA - $this->numberB;
return $this->returnResult();
}
}
class Factory{
public function calculatorFactory($operator, $numberA, $numberB){
$obj = '';
switch($operator){
case '+':
$obj = new Add($numberA, $numberB);
break;
case '-':
$obj = new Sub($numberA, $numberB);
break;
}
$result = $obj->returnResult();
return $result;
}
}
//客户端/接口
$operation = isset($_GET['operation']) ? $_GET['operation'] : '+';
$numberA = $_GET['numberA'];
$numberB = $_GET['numberB'];
$obj = new Factory();
echo $obj->calculatorFactory($operation, $numberA, $numberB);
?>
工厂方法:
<?php
class Calculator{
public $numberA;
public $numberB;
public $result;
public function returnResult(){}
}
class Add extends Calculator{
public function __construct($a, $b){
$this->numberA = $a;
$this->numberB = $b;
}
public function returnResult(){
$this->result = $this->numberA + $this->numberB;
return $this->returnResult();
}
}
class Sub extends Calculator{
public function __construct($a, $b){
$this->numberA = $a;
$this->numberB = $b;
}
public function returnResult(){
$this->result = $this->numberA - $this->numberB;
return $this->returnResult();
}
}
class Factory extends Calculator{
public static function create($class, $numberA, $numberb){
return new $class($numberA, $numberb);
}
}
//客户端/接口
$operator = isset($_GET['operation']) ? $_GET['operation'] : '+';
$numberA = $_GET['numberA'];
$numberB = $_GET['numberB'];
switch($operator){
case '+':
$class = 'objAdd';
break;
case '-':
$class = 'objSub';
break;
}
$obj = Factory::create($class, $numberA, $numberb);
echo $obj->returnResult();
?>
简单工厂模式VS工厂方法模式:
简单工厂的选择在工厂类,