工廠模式是咱們最經常使用的實例化對象模式,是用工廠方法代替new操做的一種模式。php
使用工廠模式的好處是,若是你想要更改所實例化的類名等,則只需更改該工廠方法內容便可,不需逐一尋找代碼中具體實例化的地方(new處)修改了。爲系統結構提供靈活的動態擴展機制,減小了耦合。html
根據抽象程度的不一樣,PHP工廠模式分爲三種:測試
簡單工廠模式設計
工廠方法模式代理
抽象工廠模式code
簡單工廠模式又稱靜態工廠方法模式
,之因此能夠這麼說,是由於簡單工廠模式是經過一個靜態方法
來建立對象的。htm
代碼示例:對象
<?php header('Content-Type:text/html;charset=utf-8'); /** *簡單工廠模式(靜態工廠方法模式) */ /** * Interface people 人類 */ interface people { public function say(); } /** * Class man 繼承people的男人類 */ class man implements people { // 具體實現people的say方法 public function say() { echo '我是男人<br>'; } } /** * Class women 繼承people的女人類 */ class women implements people { // 具體實現people的say方法 public function say() { echo '我是女人<br>'; } } /** * Class SimpleFactoty 工廠類 */ class SimpleFactoty { // 簡單工廠裏的靜態方法-用於建立男人對象 static function createMan() { return new man(); } // 簡單工廠裏的靜態方法-用於建立女人對象 static function createWomen() { return new women(); } } /** * 具體調用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();
運行結果:繼承
我是男人 我是女人
定義一個用於建立對象的接口,讓子類決定哪一個類實例化。 他能夠解決簡單工廠模式中的封閉開放原則問題。接口
看代碼:
<?php header('Content-type:text/html;charset=utf-8'); /* *工廠方法模式 */ /** * Interface people 人類 */ interface people { public function say(); } /** * Class man 繼承people的男人類 */ class man implements people { // 實現people的say方法 function say() { echo '我是男人-hi<br>'; } } /** * Class women 繼承people的女人類 */ class women implements people { // 實現people的say方法 function say() { echo '我是女人-hi<br>'; } } /** * Interface createPeople 建立人物類 * 注意:與上面簡單工廠模式對比。這裏本質區別在於,此處是將對象的建立抽象成一個接口。 */ interface createPeople { public function create(); } /** * Class FactoryMan 繼承createPeople的工廠類-用於實例化男人類 */ class FactoryMan implements createPeople { // 建立男人對象(實例化男人類) public function create() { return new man(); } } /** * Class FactoryMan 繼承createPeople的工廠類-用於實例化女人類 */ class FactoryWomen implements createPeople { // 建立女人對象(實例化女人類) function create() { return new women(); } } /** * Class Client 操做具體類 */ class Client { // 具體生產對象並執行對象方法測試 public function test() { $factory = new FactoryMan(); $man = $factory->create(); $man->say(); $factory = new FactoryWomen(); $man = $factory->create(); $man->say(); } } // 執行 $demo = new Client; $demo->test();
看結果:
我是男人-hi 我是女人-hi
提供一個建立一系列相關或相互依賴對象的接口。
注意:這裏和工廠方法的區別是:一系列(多個),而工廠方法只有一個。
代碼:
<?php header('Content-type:text/html;charset=utf-8'); /* * 抽象工廠模式 */ /** * Interface people 人類 */ interface people { public function say(); } /** * Class OneMan 第一個男人類-繼承people */ class OneMan implements people { // 實現people的say方法 public function say() { echo '男1:我喜歡你<br>'; } } /** * Class TwoMan 第二個男人類-繼承people */ class TwoMan implements people{ // 實現people的say方法 public function say() { echo '男2:我看上你了<br>'; } } /** * Class OneWomen 第一個女人類-繼承people */ class OneWomen implements people { // 實現people的say方法 public function say() { echo '女1:我不喜歡你<br>'; } } /** * Class TwoWomen 第二個女人類-繼承people */ class TwoWomen implements people { // 實現people的say方法 public function say() { echo '女2:滾一邊玩去<br>'; } } /** * Interface createPeople 建立對象類 * 注意:這裏將對象的建立抽象成了一個接口。 */ interface createPeople { // 建立第一個 public function createOne(); // 建立第二個 public function createTwo(); } /** * Class FactoryMan 用於建立男人對象的工廠類-繼承createPeople */ class FactoryMan implements createPeople { // 建立第一個男人 public function createOne() { return new OneMan(); } // 建立第二個男人 public function createTwo() { return new TwoMan(); } } /** * Class FactoryWomen 用於建立女人對象的工廠類-繼承createPeople */ class FactoryWomen implements createPeople { // 建立第一個女人 public function createOne() { return new OneWomen(); } // 建立第二個女人 public function createTwo() { return new TwoWomen(); } } /** * Class Client 執行測試類 */ class Client { // 具體生成對象和執行方法 public function test() { // 男人 $factory = new FactoryMan(); $man = $factory->createOne(); $man->say(); $man = $factory->createTwo(); $man->say(); // 女人 $factory = new FactoryWomen(); $man = $factory->createOne(); $man->say(); $man = $factory->createTwo(); $man->say(); } } // 執行 $demo = new Client; $demo->test();
結果:
男1:我喜歡你 男2:我看上你了 女1:我不喜歡你 女2:滾一邊玩去
簡單工廠模式(靜態方法工廠模式) : 用來生產同一等級結構中的任意產品。(不能增長新的產品)
工廠模式 :用來生產同一等級結構中的固定產品。(支持增長任意產品)
抽象工廠 :用來生產不一樣產品種類的所有產品。(不能增長新的產品,支持增長產品種類)
簡單工廠模式:
工廠類負責建立的對象較少,操做時只需知道傳入工廠類的參數便可,對於如何建立對象過程不用關心。
工廠方法模式:
知足如下條件時,能夠考慮使用工廠模式方法
當一個類不知道它所必須建立對象的類時
一個類但願由子類來指定它所建立的對象時
當類將建立對象的職責委託給多個幫助子類中得某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時
抽象工廠模式:
知足如下條件時,能夠考慮使用抽象工廠模式
系統不依賴於產品類實例如何被建立,組合和表達的細節。
系統的產品有多於一個的產品族,而系統只消費其中某一族的產品
同屬於同一個產品族是在一塊兒使用的。這一約束必須在系統的設計中體現出來。
系統提供一個產品類的庫,全部產品以一樣的接口出現,從而使客戶端不依賴於實現。
以上幾種,歸根結底,都是將重複的東西提取出來,以方便總體解耦和複用,修改時方便。可根據具體需求而選擇使用。