成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP設(shè)計(jì)模式(八):工廠模式

sorra / 1882人閱讀

摘要:原文地址設(shè)計(jì)模式八工廠模式在設(shè)計(jì)模式七設(shè)計(jì)模式分類中我們提到過(guò)創(chuàng)建設(shè)計(jì)模式,創(chuàng)建設(shè)計(jì)模式專注于設(shè)計(jì)對(duì)象和實(shí)例的創(chuàng)建過(guò)程。工廠模式工廠模式,也是五種設(shè)計(jì)模式中唯一的類的設(shè)計(jì)模式,即在類中就能實(shí)現(xiàn)的設(shè)計(jì)模式。

原文地址:PHP設(shè)計(jì)模式(八):工廠模式

Introduction

在PHP設(shè)計(jì)模式(七):設(shè)計(jì)模式分類中我們提到過(guò)創(chuàng)建設(shè)計(jì)模式(Creation patterns),創(chuàng)建設(shè)計(jì)模式專注于設(shè)計(jì)對(duì)象(Object)和實(shí)例(Instance)的創(chuàng)建過(guò)程。
創(chuàng)建設(shè)計(jì)模式包括下面五種設(shè)計(jì)模式:

抽象工廠設(shè)計(jì)模式(Abstract Factory)

生成器模式(Builder)

工廠設(shè)計(jì)模式(Factory Method)

原型設(shè)計(jì)模式(Prototype Method)

單例設(shè)計(jì)模式(Singleton)

當(dāng)程序逐漸擴(kuò)展的時(shí)候,需要更多的新對(duì)象,新對(duì)象的創(chuàng)建不應(yīng)該依賴于創(chuàng)建者,換句話說(shuō),新對(duì)象的創(chuàng)建過(guò)程,不應(yīng)該依賴調(diào)用創(chuàng)建函數(shù)的對(duì)象。為了減少冗余,增加拓展性,工廠模式就是一種創(chuàng)建新對(duì)象時(shí)使用的設(shè)計(jì)模式。

工廠模式

工廠模式,也是五種設(shè)計(jì)模式中唯一的類的設(shè)計(jì)模式(Class patterns),即在類中就能實(shí)現(xiàn)的設(shè)計(jì)模式。
聽(tīng)起來(lái)挺抽象?對(duì)比原型設(shè)計(jì)模式,這是一種對(duì)象設(shè)計(jì)模式(Object patterns),通過(guò)對(duì)象的__clone()方法來(lái)實(shí)現(xiàn)的設(shè)計(jì)模式。
在工廠模式中,新創(chuàng)建的對(duì)象/產(chǎn)品并不依賴于生產(chǎn)它的對(duì)象/工廠,新對(duì)象和調(diào)用者之間是低耦合狀態(tài)。通常調(diào)用者和工廠交互,由工廠來(lái)生成新對(duì)象,新對(duì)象只和工廠有關(guān)。

何時(shí)使用工廠模式?

簡(jiǎn)單來(lái)說(shuō),當(dāng)需求對(duì)類的個(gè)數(shù)不明確的時(shí)候,可以使用工廠模式,如:
你需要?jiǎng)?chuàng)建一個(gè)在線博物館,但你并不確切的知道究竟有多少文物,你不可能無(wú)限的增加新的文物類,同時(shí)對(duì)于損毀的文物,你不可能無(wú)限的去清理這些類。
反過(guò)來(lái)說(shuō),如果你確切的知道類的總量,那么你就沒(méi)有必要使用工程模式,直接通過(guò)繼承的方式就能實(shí)現(xiàn)好的設(shè)計(jì)。

Example

還是使用我們慣用的鯨魚和鯉魚的例子,現(xiàn)在我們想實(shí)現(xiàn)一個(gè)海洋館,目前我們并不確定究竟有多少海洋生物。
先是一個(gè)抽象的工廠類:

create();
  }
}
?>

然后是兩個(gè)工廠:鯨魚工廠和鯉魚工廠

create();
  }
}
class CarpFactory extends Factory {
  protected function create() {
    $carp = new Carp();
    return $carp->create();
  }
}
?>

然后是抽象的動(dòng)物接口:

然后是具體的動(dòng)物類:鯨魚類和鯉魚類

name = "Whale";
    return $this->name . " is created.
";
  }
}
class Carp implements Animal {
  private $name;
  public function create() {
    $this->name = "Carp";
    return $this->name . " is created.
";
  }
}
?>

下面給出使用工廠創(chuàng)建鯨魚和鯉魚的代碼:

factoryStart();
$carpFactory = new CarpFactory();
echo $carpFactory->factoryStart();
?>

運(yùn)行一下:

Whale is created.
Carp is created.

到這里你是不是覺(jué)得,其實(shí)直接生成兩個(gè)類就行了,何必搞這么復(fù)雜?別著急,好戲在后面。

修改類的方法

由于Interface的限制,修改類的方法被限定在了create()方法中,因此可以避免偷懶的程序員新增加的不合理函數(shù)。
簡(jiǎn)單修改一下:

name = "Whale";
    return $this->name . " is created. Whale eats fish.
";
  }
}
class Carp implements Animal {
  private $name;
  public function create() {
    $this->name = "Carp";
    return $this->name . " is created. Carp eats moss.
";
  }
}
?>

由于對(duì)象是由工廠造出來(lái)的,外部不可能直接調(diào)用或者修改類的實(shí)現(xiàn),類的修改被限定在了類的對(duì)外接口上。這樣的架構(gòu)易于擴(kuò)展。

一個(gè)工廠

工廠模式的靈活,在于可以只擁有一個(gè)工廠,卻能生產(chǎn)多個(gè)類/產(chǎn)品。
修改我們的抽象工廠,給create()方法增加animal接口:

create($animal);
  }
}
?>

然后合并之前的鯨魚工廠和鯉魚工廠:

create();
  }
}
?>

修改使用工廠創(chuàng)建鯨魚和鯉魚的代碼:

factoryStart(new Whale());
echo $animalFactory->factoryStart(new Carp());
?>

運(yùn)行一下:

Whale is created. Whale eats fish.
Carp is created. Carp eats moss.

鯨魚類和鯉魚類源源不斷的從一個(gè)工廠中被創(chuàng)建出來(lái)了。通過(guò)這種設(shè)計(jì)模式,類的創(chuàng)建過(guò)程統(tǒng)一通過(guò)一個(gè)接口來(lái)實(shí)現(xiàn),接口外部并不需要關(guān)心類是如何被創(chuàng)建出來(lái)的,而接口內(nèi)部實(shí)現(xiàn)也得到了很好的拓展性。

Summary

本文介紹了工廠設(shè)計(jì)模式,使用這種設(shè)計(jì)模式,可以讓你通過(guò)一個(gè)或多個(gè)工廠的接口,創(chuàng)建無(wú)數(shù)新類,調(diào)用任意類的方法。由于接口嚴(yán)格定義了新類/產(chǎn)品的形態(tài),因此在維護(hù)和拓展的時(shí)候,可以省去不少力氣。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/21678.html

相關(guān)文章

  • PHP設(shè)計(jì)模式(九):原型設(shè)計(jì)模式

    摘要:原型設(shè)計(jì)模式中的構(gòu)造函數(shù)使用創(chuàng)建新對(duì)象時(shí),并不會(huì)觸發(fā)類的構(gòu)造函數(shù)。事實(shí)上,使用構(gòu)造函數(shù)并不一定是一個(gè)好的設(shè)計(jì),由于構(gòu)造函數(shù)內(nèi)的邏輯無(wú)法被外部控制,當(dāng)需要修改一個(gè)類構(gòu)造時(shí)的邏輯時(shí),除了修改類的構(gòu)造函數(shù)實(shí)現(xiàn)以外,別無(wú)他法,這破壞了類的封裝。 原文地址:PHP設(shè)計(jì)模式(九):原型設(shè)計(jì)模式 Introduction 在PHP設(shè)計(jì)模式(八):工廠模式中我們介紹了創(chuàng)建設(shè)計(jì)模式(Creation p...

    warnerwu 評(píng)論0 收藏0
  • JS 設(shè)計(jì)模式 (建造者模式

    摘要:即建造者模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過(guò)程。指導(dǎo)類負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅?lái)組建產(chǎn)品,指導(dǎo)類一般不與產(chǎn)品類發(fā)生依賴關(guān)系,與指導(dǎo)類直接交互的是建造者類建造者模式優(yōu)點(diǎn)建造者模式的封裝性很好。 建造者模式 將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。主要解決在軟件系統(tǒng)中,有時(shí)候面臨著一個(gè)復(fù)雜對(duì)象的創(chuàng)建工作,由于需求的變化,這個(gè)復(fù)雜對(duì)象的某些部分經(jīng)常面臨著劇烈的變化...

    tanglijun 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式(一)簡(jiǎn)單工廠模式 (Simple Factory For PHP

    摘要:工廠模式使一個(gè)類的實(shí)例化延遲到其子類。參考系列源地址系列目錄設(shè)計(jì)模式概述設(shè)計(jì)模式一簡(jiǎn)單工廠模式設(shè)計(jì)模式二工廠方法模式設(shè)計(jì)模式三抽象工廠模式設(shè)計(jì)模式四單例模式 一、什么是簡(jiǎn)單工廠模式 簡(jiǎn)單工廠 (Simple Factory)又稱靜態(tài)工廠方法模式(Static Factory Method Pattern)   使用的頻率可以說(shuō)是非常之高,它的官方解釋為:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子...

    Hancock_Xu 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式(二)工廠方法模式(Factory Method)

    摘要:對(duì)于這個(gè)問(wèn)題,接下來(lái)的工廠方法模式可以解決這個(gè)問(wèn)題。二工廠方法模式的優(yōu)點(diǎn)擁有良好的封裝性,代碼結(jié)構(gòu)清晰。參考系列源地址系列目錄設(shè)計(jì)模式概述設(shè)計(jì)模式一簡(jiǎn)單工廠模式設(shè)計(jì)模式二工廠方法模式設(shè)計(jì)模式三抽象工廠模式設(shè)計(jì)模式四單例模式 簡(jiǎn)單工廠簡(jiǎn)述: 簡(jiǎn)單工廠模式實(shí)現(xiàn)了產(chǎn)品類的代碼跟客戶端代碼分離,但會(huì)有一個(gè)問(wèn)題,優(yōu)秀的代碼是符合開(kāi)閉原則如果你要加一個(gè)C類產(chǎn)品,你就要修改工廠類里面的代碼,也就是說(shuō)...

    zhjx922 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式(三)抽象工廠模式(Abstract Factory)

    摘要:支持增加任意產(chǎn)品抽象工廠用來(lái)生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。對(duì)于增加新的產(chǎn)品,無(wú)能為力支持增加產(chǎn)品族參考系列源地址系列目錄設(shè)計(jì)模式概述設(shè)計(jì)模式一簡(jiǎn)單工廠模式設(shè)計(jì)模式二工廠方法模式設(shè)計(jì)模式三抽象工廠模式設(shè)計(jì)模式四單例模式 一、什么是抽象工廠模式 抽象工廠模式的用意為:給客戶端提供一個(gè)接口,可以創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象 ,而且使用抽象工廠模式還要滿足以下條件: 系統(tǒng)中有多個(gè)產(chǎn)品族,而系統(tǒng)一次...

    W_BinaryTree 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<