面向对象的洗礼:设计模式(八)之工厂方法
工厂方法:定义一个工厂接口,用来创建产品对象,将实际创建工作推迟到子类当中。
工厂方法来源于简单工厂模式,是简单工厂模式的一个衍生品。核心的工厂类不再进行类的实例化,核心工厂类不再负责产品的创建,核心的工厂类只负责子类的接口,使核心工厂类抽象化,成为一个抽象工厂。
工厂方法的优点:在简单工厂模式的基础上再次对核心工厂类进行抽象,在需要添加新的产品时,更好的依赖于开放-封闭原则,不需要修改具体的工厂角色即可扩展。
场景:简单计算器。以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工厂方法模式:
简单工厂的选择在工厂类,