PHP設計模式――簡單工廠
來源:程序員人生 發布時間:2015-04-14 08:23:03 閱讀次數:3267次
聲明:本系列博客參考資料《大話設計模式》,作者程杰。
前面兩節內容介紹了甚么是設計模式和6大原則,相信看完前兩節內容大家對設計模式已有了初步的認識,接下來講1下設計模式的分類。
1般將面向對象設計模式分為3類:創建型、結構型、行動型3種。
創建型:創建對象時,不再由我們直接實例化對象;而是根據特定場景,由程序來肯定創建對象的方式,從而保證更大的性能、更好的架構優勢。創建型模式主要有簡單工廠模式(其實不是23種設計模式之1)、工廠方法、抽象工廠模式、單例模式、生成器模式、原型模式。
結構型:用于幫助將多個對象組織成更大的結構。結構型模式主要有適配器模式、橋接模式、組合器模式、裝潢器模式、門面模式、亨元模式和代理模式。
行動型:用于幫助系統間各對象的通訊,和如何控制復雜系統中流程。行動型模式主要有命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、視察者模式、狀態模式、策略模式、模板模式、訪問者模式和職責鏈模式。
今天主要介紹創建型的第1種簡單工廠模式。
注意:在瀏覽本系列博客的時候1定要有瀏覽UML類圖、面向對象PHP編程基礎。
簡單工廠模式不屬于23種經常使用面向對象設計模式之1。簡單工廠模式是由1個工廠對象決定創建出哪種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的1個特殊實現。其實質是由1個工廠類根據傳入的參數,動態決定應當創建哪個產品類(這些產品類繼承自1個父類或接口)的實例。

角色及職責:
工廠(SimpleFactory)角色:簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
抽象產品(IProduct)角色:簡單工廠模式所創建的所有對象的父類,它負責描寫所有實例所共有的公共接口。
具體產品(Concrete Product)角色:是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。
需求:根據提供相應的屬性值由簡單工廠創建具有相應特性的產品對象。
現根據以上UML類圖編寫以下PHP代碼。
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/9
* Time: 21:48
*/
/**抽象產品角色
* Interface IProduct 產品接口
*/
interface IProduct
{
/**X軸旋轉
* @return mixed
*/
function XRotate();
/**Y軸旋轉
* @return mixed
*/
function YRotate();
}
/**具體產品角色
* Class XProduct X軸旋轉產品
*/
class XProduct implements IProduct
{
private $xMax=1;
private $yMax=1;
function __construct($xMax,$yMax)
{
$this->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;
}
}
}
測試代碼:
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/9
* Time: 21:54
*/
require_once "./SimpleFactory/SimpleFactory.php";
header("Content-Type:text/html;charset=utf⑻");
$pro=array();
$pro[]=ProductFactory::GetInstance(1,12);
$pro[]=ProductFactory::GetInstance(12,1);
$pro[]=ProductFactory::GetInstance(12,12);
$pro[]=ProductFactory::GetInstance(0,12);
foreach($pro as $v)
{
if($v)
{
echo "<br/>";
$v->XRotate();
echo "<br/>";
$v->YRotate();
}
else
{
echo "非法產品!<br/>";
}
echo "<hr/>";
}
用閱讀器訪問測試代碼,我們可以發現創建的對象順次是YProduct,XProduct,XYProduct,null。簡單工廠的核心代碼在于工廠(ProductFactory)這個角色,這里根據傳入的xMax與yMax值去創建不同的對象,這便是簡單工廠的實質,而且我們在測試調用客戶端根本不知道具體的產品類是甚么樣,這樣就做到了調用與創建的分離。
簡單工廠的優點:讓對象的調用者和對象創建進程分離,當對象調用者需要對象時,直接向工廠要求便可。從而避免了對象的調用者與對象的實現類以硬編碼方式耦合,以提高系統的可保護性、可擴大性。
簡單工廠的缺點:當產品修改時,工廠類也要做相應的修改,比如要增加1種操作類,如求M數的N次方,就得改case,修改原有類,背背了開放-封閉原則。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈