簡單工廠模式
簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解爲是不同工廠模式的一個特殊實現。
簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。因爲在簡單工廠模式中用於創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。
基本流程
首先將需要創建的各種不同對象(例如各種不同的 Chart 對象)的相關代碼封裝到不同的類中,這些類稱爲具體產品類,而將它們公共的代碼進行抽象和提取後封裝在一個抽象產品類中,每一個具體產品類都是抽象產品類的子類;然後提供一個工廠類用於創建各種產品,在工廠類中提供一個創建產品的工廠方法,該方法可以根據所傳入的參數不同創建不同的具體產品對象;客戶端只需調用工廠類的工廠方法並傳入相應的參數即可得到一個產品對象。
舉例
以計算器爲例實現簡單工廠模式。
結構圖如圖
OperationFactory(工廠角色):工廠角色即工廠類,它是簡單工廠模式的核心,負責實現創建所有產品實例的內部邏輯;工廠類可以被外界直接調用,創建所需的產品對象;在工廠類中提供了靜態的工廠方法 createOperate(),它的返回類型爲具體產品角色。
Operation(抽象產品角色):它是工廠類所創建的所有對象的父類,封裝了各種產品對象的公有方法,它的引入將提高系統的靈活性,使得在工廠類中只需定義一個通用的工廠方法,因爲所有創建的具體產品對象都是其子類對象。
OperateAdd、OperateSub、OperateMul、OperateDiv(具體產品角色):它是簡單工廠模式的創建目標,所有被創建的對象都充當這個角色的某個具體類的實例。每一個具體產品角色都繼承了抽象產品角色,需要實現在抽象產品中聲明的抽象方法。
PHP代碼實現
<?php
//抽象產品角色
abstract class Operation
{
private $numA,$numB;
public function __set($name,$value){
$this->$name=$value;
}
public function __get($name){
return $this->$name;
}
abstract public function getResult();
}
//具體產品角色
class OperateAdd extends Operation
{
public function getResult(){
$result=$this->numA+$this->numB;
return $result;
}
}
class OperateSub extends Operation
{
public function getResult(){
$result=$this->numA-$this->numB;
return $result;
}
}
class OperateMul extends Operation
{
public function getResult(){
$result=$this->numA*$this->numB;
return $result;
}
}
class OperateDiv extends Operation
{
public function getResult(){
if($this->numB==0){
throw new Exception("除數不能爲零", 1);
}
$result=$this->numA/$this->numB;
return $result;
}
}
//工廠角色
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;
default:
break;
}
return $oper;
}
}
$oper=OperationFactory::createOperate('+');
$oper->numA=5;
$oper->numB=5;
$b=$oper->getResult();