標籤:des style http 使用 io art ar cti
設計模式-使用php實現Factory 方法模式
【概要】
建立型模式
定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method使用一個類的執行個體化延遲到其子類【GOF95】
【結構圖】
【主要角色】
抽象產品(Product)角色:詳細產品對象共同擁有的父類或介面
詳細產品(Concrete Product)角色:實現抽象產品角色所定義的介面,而且Factory 方法模式所建立的每個對象都是某詳細產品對象的執行個體
抽象工廠(Creator)角色:模式中不論什麼建立對象的工廠類都要實現這個介面,它聲明了Factory 方法,該方法返回一個Product類型的對象。
Creator也能夠定義一個Factory 方法的預設實現,它返回一個預設的的ConcreteProduct對象
詳細工廠(Concrete Creator)角色:實現抽象工廠介面,詳細工廠角色與應用邏輯相關,由應用程式直接調用以建立產品對象。
【優缺點】
長處:Factory 方法模式能夠同意系統在不改動工廠角色的情況下引進新產品。
缺點:客戶可能只為了建立一個特定的ConcreteProduct對象,就不得不建立一個Creator子類
【適用性】
1、當一個類不知道它所必須建立的對象的類的時候
2、當一個類希望由它的子類來指定它所建立的對象的時候
3、當類將建立對象的職責託付給多個協助子類的某一個,而且你希望將哪一個協助子類是代理者這一資訊局部化的時候
【原廠模式php執行個體】
<?php /** * Factory 方法模式 * ------------- * @author zhaoxuejie <[email protected]> * @package design pattern * @version v1.0 2011-12-14 *///抽象產品interface Work {public function doWork(); }//詳細產品實現class Student implements Work {function doWork(){echo "學生做作業!\n";}}class Teacher implements Work {function doWork(){echo "老師批改作業!\n";}}//抽象工廠interface WorkerFactory {public function getWorker();}//詳細抽象工廠實現class StudentFactory {function getWorker(){return new Student();}}class TeacherFactory {function getWorker(){return new Teacher();}}//clientclass Client {static function main() {$s = new Student();$s->doWork();$t = new Teacher();$t->doWork();}}Client::main();?>
【簡單原廠模式】
從設計模式的類型上來說,簡單原廠模式是屬於建立型模式,又叫做靜態Factory 方法(StaticFactory Method)模式,但不屬於23種GOF設計模式之中的一個。簡單原廠模式是由一個工廠對象決定建立出哪一種產品類的執行個體。簡單原廠模式是原廠模式家族中最簡單有用的模式,能夠理解為是不同原廠模式的一個特殊實現。
【簡單原廠模式php執行個體】
<?php /** * 簡單原廠模式 * ------------- * @author zhaoxuejie <[email protected]> * @package design pattern * @version v1.0 2011-12-14 */interface Comput {public function getResults();}//操作類class Operation {protected $Number_A = 0;protected $Number_B = 0;protected $Result = 0;//賦值function setNumber($Number_A, $Number_B){$this->Number_A = $Number_A;$this->Number_B = $Number_B;}//清零function clearResult(){$this->Result = 0;}}//加法class OperationAdd extends Operation implements Comput {function getResults(){return $this->Result = ($this->Number_A + $this->Number_B);}}//減法class OperationSub extends Operation implements Comput {function getResults(){return $this->Result = ($this->Number_A - $this->Number_B);}}//乘法class OperationMul extends Operation implements Comput {function getResults(){return $this->Result = ($this->Number_A * $this->Number_B);}}//除法class OperationDiv extends Operation implements Comput {function getResults(){if(intval($this->Number_B) == 0){return $this->Result = ‘Error: Division by zero‘;}return $this->Result = ($this->Number_A / $this->Number_B);}}//工廠class OperationFactory {private static $obj;public static function CreateOperation($type){try { $error = "Please input the ‘+‘, ‘-‘, ‘*‘, ‘/‘ symbols of Math."; switch($type){case ‘+‘ :self::$obj = new OperationAdd();break;case ‘-‘ :self::$obj = new OperationSub();break;case ‘*‘ :self::$obj = new OperationMul();break;case ‘/‘ :self::$obj = new OperationDiv();break;default:throw new Exception($error);}return self::$obj;} catch (Exception $e) {echo ‘Caught exception: ‘, $e->getMessage(), "\n";exit;}}}//工廠建立執行個體$obj = OperationFactory::CreateOperation(‘*‘);$obj->setNumber(3, 4);echo $obj->getResults();?>