簡單工廠模式
1、抽象基類:類中定義抽象一些方法,用以在子類中實現
2、繼承自抽象基類的子類:實現基類中的抽象方法
3、工廠類:用以實例化所有相對應的子類
舉例
/*
*定義個抽象的類,讓子類去繼承實現它
*/
abstract class Operation{
//抽象方法不能包含函數體
abstract public function getValue($num1,$num2);//強烈要求子類必須實現該功能函數
}
/*
* 加法類
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2;
}
}
/**
* 減法類
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 乘法類
*/
class OperationMul extends Operation {
public function getValue($num1,$num2){
return $num1*$num2;
}
}
/**
* 除法類
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==0){
throw new Exception("除數不能爲0");
}else {
return $num1/$num2;
}
}catch (Exception $e){
echo "錯誤信息:".$e->getMessage();
}
}
}
通過採用面向對象的繼承特性,我們可以很容易就能對原有程序進行擴展,比如:‘乘方’,‘開方’,‘對數’,‘三角函數’,‘統計’等,以還可以避免加載沒有必要的代碼。
如果我們現在需要增加一個求餘的類,會非常的簡單。我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大大的降低了耦合度,方便日後的維護及擴展。
/*
* 求餘類(remainder)
*
*/
class OperationRem extends Operation {
public function getValue($num1,$num2){
return $num1%$num12;
}
}
現在還有一個問題未解決,就是如何讓程序根據用戶輸入的操作符實例化相應的對象呢?
解決辦法:使用一個單獨的類來實現實例化的過程,這個類就是工廠
/*
* 工廠類,主要用來創建對象
* 功能:根據輸入的運算符號,工廠就能實例化出合適的對象
*
*/
class Factory{
public static function createObj($operate){
switch ($operate){
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result;
其他關於關於此模式的筆記:
工廠模式:
以交通工具爲例子:要求請既可以定製交通工具,又可以定製交通工具生產的過程
一、定製交通工具
1.定義一個接口,裏面包含交工工具的方法(啓動 運行 停止)
2.讓飛機,汽車等類去實現他們
二、定製工廠(通上類似)
1.定義一個接口,裏面包含交工工具的製造方法(啓動 運行 停止)
2.分別寫製造飛機,汽車的工廠類去繼承實現這個接口