本文實例講述了PHP設計模式之簡單工廠和工廠模式。分享給大家供大家參考,具體如下:
工廠模式是創建型模式的一種,分為簡單工廠模式,工廠模式,抽象工廠模式,簡單工廠可以稱之為工廠模式的一個特例
先用一段簡單的代碼說明一下,現在假設我們是顧客,需要蘋果味飲料和香蕉味飲料
?php
class AppleDrink{
function getDrinkName()
{
echo '蘋果飲料';
}
}
class BananaDrink{
function getDrinkName()
{
echo '香蕉飲料';
}
}
//顧客1
$apple = new AppleDrink();
$apple->getDrinkName();
echo "br/>";
$banana = new BananaDrink();
$banana->getDrinkName();
echo "br/>";
//顧客2
$apple1 = new AppleDrink();
$apple1->getDrinkName();
echo "br/>";
$banana1 = new BananaDrink();
$banana1->getDrinkName();
運行結果:
蘋果飲料
香蕉飲料
蘋果飲料
香蕉飲料
這是最基本的寫法,顧客和飲料是強耦合關系,也就是咱們平常說的硬編碼
有一天,老板覺得AppleDrink這個名字在國內不好賣,想要改成Xingmu(醒目)這種接中國地氣的名字(麥當勞改成金拱門)
你會發現,需要去代碼中找到每一處NEW的地方,全部改成new Xingmu()
如果它還有其他的初始化步驟,就更是噩夢,很可能會引起一些不必要的麻煩
下面咱們用簡單工廠模式,更改一下這個文件
?php
class AppleDrink{
function getDrinkName()
{
echo '蘋果飲料';
}
}
class BananaDrink{
function getDrinkName()
{
echo '香蕉飲料';
}
}
class FruitFactory{
function makeDrink($fruit){
if ($fruit == 'apple'){
return new AppleDrink();
}elseif ($fruit == 'banana'){
return new BananaDrink();
}
}
}
$factory = new FruitFactory();
$apple = $factory->makeDrink('apple');
$apple->getDrinkName();
echo "br/>";
$banana = $factory->makeDrink('banana');
$banana->getDrinkName();
echo "br/>";
$apple1 = $factory->makeDrink('apple');
$apple1->getDrinkName();
echo "br/>";
$banana1 = $factory->makeDrink('banana');
$banana1->getDrinkName();
運行結果:
蘋果飲料
香蕉飲料
蘋果飲料
香蕉飲料
現在我們發現,假如說老板想改名字,我只需要把FruitFactory里的new AppleDrink
改為new Xingmu()
即可,其他地方都不需要改動,也不用翻代碼找哪些地方用new
了,實現了顧客和飲料之間的解耦,也符合面向對象的設計思想,我只是想要一瓶飲料,我并不需要了解這個飲料是怎么制造出來的
這就是簡單工廠模式,用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的,外界與具體類隔離開來,耦合性低,有利于整個軟件體系結構的優化,適用于工廠類負責創建的對象比較少,客戶只知道傳入了工廠類的參數,對于如何創建對象(邏輯)不關心,簡單工廠模式又叫靜態工廠模式 可以把工廠類的方法寫成靜態方法 在不需要實例化工廠的前提下 直接調用靜態方法 返回所需實例
好的,那么接下來,問題又來了,公司準備多元化產品,增加桔子味飲料,那么我們需要怎么做呢,首先要增加桔子味飲料類,然后需要在工廠里增加判斷,當水果標識是orange的時候,返回桔子味飲料
class OrangeDrink{
function getDrinkName()
{
echo '桔子味飲料';
}
}
class FruitFactory{
function makeDrink($fruit){
if ($fruit == 'apple'){
return new AppleDrink();
}elseif ($fruit == 'banana'){
return new BananaDrink();
}elseif ($fruit == 'orange'){
return new OrangeDrink();
}
}
}
然后當以后每次需要增加新的產品時,我們都需要更改工廠文件,當對象生成復雜的時候,這個工廠文件會越來越大,更改或許會引起一些意想不到的問題
面向對象的設計原則,對擴展開放,對更改關閉,那么有沒有辦法,在不更改原有代碼的基礎上,增加產品呢
答案是有的,咱們再改寫一下這個方法
?php
interface Drink{
function getDrinkName();
}
class AppleDrink implements Drink{
function getDrinkName()
{
echo '蘋果味飲料';
}
}
class BananaDrink implements Drink{
function getDrinkName()
{
echo '香蕉味飲料';
}
}
interface FruitFactory{
function makeDrink();
}
class AppleFactory implements FruitFactory{
function makeDrink()
{
return new AppleDrink();
}
}
class BananaFactory implements FruitFactory{
function makeDrink()
{
return new BananaDrink();
}
}
$appleFactory = new AppleFactory();
$apple = $appleFactory->makeDrink();
$apple->getDrinkName();
echo "br/>";
$bananaFactory = new BananaFactory();
$banana = $bananaFactory->makeDrink();
$banana->getDrinkName();
運行結果:
蘋果味飲料
香蕉味飲料
現在當再次需要增加桔子味飲料時,只需要增加桔子味飲料產品和桔子味飲料工廠即可,不需要改動原來的代碼
class OrangeDrink implements Drink{
function getDrinkName()
{
echo '桔子味飲料';
}
}
class OrangeFactory implements FruitFactory{
function makeDrink()
{
return new OrangeDrink();
}
}
這就是工廠模式,它是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現開閉原則,實現了對擴展開放,對更改關閉。其次實現更復雜的層次結構,可以應用于產品結果復雜的場合。工廠方法模式是對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不在負責具體的產品生產,而是只制定一些規范,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。
總結:
無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬于工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法后,由于類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對于抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之后,它就演變成了工廠方法模式。所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- php設計模式 Decorator(裝飾模式)
- PHP面向對象程序設計組合模式與裝飾模式詳解
- php設計模式之策略模式應用案例詳解
- PHP中常用的三種設計模式詳解【單例模式、工廠模式、觀察者模式】
- PHP經典設計模式之依賴注入定義與用法詳解
- PHP設計模式之策略模式原理與用法實例分析
- PHP設計模式之觀察者模式定義與用法分析
- PHP設計模式之單例模式定義與用法分析
- PHP設計模式之抽象工廠模式實例分析
- PHP設計模式之觀察者模式(Observer)詳細介紹和代碼實例
- php設計模式之裝飾模式應用案例詳解