前面兩節內容介紹了什麼是設計模式以及六大原則,相信看完前兩節內容大家對設計模式已經有了初步的認識,接下來說一下設計模式的分類。
一般將面向對象設計模式分為三類:創建型、結構型、行為型三種。
創建型:創建對象時,不再由我們直接實例化對象;而是根據特定場景,由程序來確定創建對象的方式,從而保證更大的性能、更好的架構優勢。創建型模式主要有簡單工廠模式(並不是23種設計模式之一)、工廠方法、抽象工廠模式、單例模式、生成器模式、原型模式。
結構型:用於幫助將多個對象組織成更大的結構。結構型模式主要有適配器模式、橋接模式、組合器模式、裝飾器模式、門面模式、亨元模式和代理模式。
行為型:用於幫助系統間各對象的通信,以及如何控制復雜系統中流程。行為型模式主要有命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態模式、策略模式、模板模式、訪問者模式和職責鏈模式。
今天主要介紹創建型的第一種簡單工廠模式。
注意:在閱讀本系列博客的時候一定要有閱讀UML類圖、面向對象PHP編程基礎。
簡單工廠模式不屬於23種常用面向對象設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。其實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
角色及職責:
工廠(SimpleFactory)角色:簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
抽象產品(IProduct)角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
具體產品(Concrete Product)角色:是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。
需求:根據提供相應的屬性值由簡單工廠創建具有相應特性的產品對象。
現根據以上UML類圖編寫如下PHP代碼。
xMax=$xMax; $this->yMax=1; } function XRotate() { echo 您好,我是X軸旋轉產品,X軸轉轉轉。。。。。。; } function YRotate() { echo 抱歉,我是X軸旋轉產品,我沒有Y軸。。。。。。; } } /**具體產品角色 * Class YProduct Y軸旋轉產品 */ class YProduct implements IProduct { private $xMax=1; private $yMax=1; function __construct($xMax,$yMax) { $this->xMax=1; $this->yMax=$yMax; } function XRotate() { echo 抱歉,我是Y軸旋轉產品,我沒有X軸。。。。。。; } function YRotate() { echo 您好,我是Y軸旋轉產品,Y軸轉轉轉。。。。。。; } } /**具體產品角色 * Class XYProduct XY軸都可旋轉產品 */ class XYProduct implements IProduct { private $xMax=1; private $yMax=1; function __construct($xMax,$yMax) { $this->xMax=$xMax; $this->yMax=$yMax; } function XRotate() { echo 您好,我是XY軸都可旋轉產品,X軸轉轉轉。。。。。。; } function YRotate() { echo 您好,我是XY軸都可旋轉產品,Y軸轉轉轉。。。。。。; } } /**工廠角色 * Class ProductFactory */ class ProductFactory { static function GetInstance($xMax,$yMax) { if($xMax>1 && $yMax===1) { return new XProduct($xMax,$yMax); } elseif($xMax===1 && $yMax>1) { return new YProduct($xMax,$yMax); } elseif($xMax>1 && $yMax>1) { return new XYProduct($xMax,$yMax); } else { return null; } } }
; $v->XRotate(); echo ; $v->YRotate(); } else { echo 非法產品! ; } echo
簡單工廠的優點:讓對象的調用者和對象創建過程分離,當對象調用者需要對象時,直接向工廠請求即可。從而避免了對象的調用者與對象的實現類以硬編碼方式耦合,以提高系統的可維護性、可擴展性。
簡單工廠的缺點:當產品修改時,工廠類也要做相應的修改,比如要增加一種操作類,如求M數的N次方,就得改case,修改原有類,違背了開放-封閉原則。