簡單工廠模式 ①抽象基類:類中定義抽象一些方法,用以在子類中實現(xiàn) ②繼承自抽象基類的子類:實現(xiàn)基類中的抽象方法 ③工廠類:用以實例化所有相對應(yīng)的子類 ![]() /** * * 定義個抽象的類,讓子類去繼承實現(xiàn)它 * */ abstract class Operation{ //抽象方法不能包含函數(shù)體 abstract public function getValue($num1,$num2);//強烈要求子類必須實現(xiàn)該功能函數(shù) } /** * 加法類 */ 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("除數(shù)不能為0"); }else { return $num1/$num2; } }catch (Exception $e){ echo "錯誤信息:".$e->getMessage(); } } } 通過采用面向?qū)ο蟮睦^承特性,我們可以很容易就能對原有程序進行擴展,比如:‘乘方’,‘開方’,‘對數(shù)’,‘三角函數(shù)’,‘統(tǒng)計’等,以還可以避免加載沒有必要的代碼。 如果我們現(xiàn)在需要增加一個求余的類,會非常的簡單 我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應(yīng)的功能(比如:求乘方的運算),而且大大的降低了耦合度,方便日后的維護及擴展 復(fù)制代碼 /** * 求余類(remainder) * */ class OperationRem extends Operation { public function getValue($num1,$num2){ return $num1%$num12; } 現(xiàn)在還有一個問題未解決,就是如何讓程序根據(jù)用戶輸入的操作符實例化相應(yīng)的對象呢? 解決辦法:使用一個單獨的類來實現(xiàn)實例化的過程,這個類就是工廠 /** * 工程類,主要用來創(chuàng)建對象 * 功能:根據(jù)輸入的運算符號,工廠就能實例化出合適的對象 * */ 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; 其他關(guān)于關(guān)于此模式的筆記: 工廠模式: 以交通工具為例子:要求請既可以定制交通工具,又可以定制交通工具生產(chǎn)的過程 1>定制交通工具 1.定義一個接口,里面包含交工工具的方法(啟動 運行 停止) 2.讓飛機,汽車等類去實現(xiàn)他們 2> 定制工廠(通上類似) 1.定義一個接口,里面包含交工工具的制造方法(啟動 運行 停止) 2.分別寫制造飛機,汽車的工廠類去繼承實現(xiàn)這個接口 |
|
來自: 哇嘿嘿 > 《設(shè)計模式》