PHP設計模式 八 工廠模式

2021-09-19 05:24:36 字數 2535 閱讀 8580

在php設計模式(七):設計模式分類中我們提到過建立設計模式(creation patterns),建立設計模式專注於設計物件(object)和例項(instance)的建立過程。

建立設計模式包括下面五種設計模式:

抽象工廠設計模式(abstract factory)

生成器模式(builder)

工廠設計模式(factory method)

原型設計模式(prototype method)

單例設計模式(singleton)

當程式逐漸擴充套件的時候,需要更多的新物件,新物件的建立不應該依賴於建立者,換句話說,新物件的建立過程,不應該依賴呼叫建立函式的物件。為了減少冗餘,增加拓展性,工廠模式就是一種建立新物件時使用的設計模式。

工廠模式,也是五種設計模式中唯一的類的設計模式(class patterns),即在類中就能實現的設計模式。

聽起來挺抽象?對比原型設計模式,這是一種物件設計模式(object patterns),通過物件的__clone()方法來實現的設計模式。

在工廠模式中,新建立的物件/產品並不依賴於生產它的物件/工廠,新物件和呼叫者之間是低耦合狀態。通常呼叫者和工廠互動,由工廠來生成新物件,新物件只和工廠有關。

還是使用我們慣用的鯨魚和鯉魚的例子,現在我們想實現乙個海洋館,目前我們並不確定究竟有多少海洋生物。

先是乙個抽象的工廠類:

<?php

abstract class factory

}?>

然後是兩個工廠:鯨魚工廠和鯉魚工廠

<?php

class whalefactory extends factory

}class carpfactory extends factory

}?>

然後是抽象的動物介面:

<?php

inte***ce animal

?>

然後是具體的動物類:鯨魚類和鯉魚類

<?php

class whale implements animal

}class carp implements animal

}?>

下面給出使用工廠建立鯨魚和鯉魚的**:

<?php

$whalefactory = new whalefactory();

echo $whalefactory->factorystart();

$carpfactory = new carpfactory();

echo $carpfactory->factorystart();

?>

執行一下:

whale is created.

carp is created.

到這裡你是不是覺得,其實直接生成兩個類就行了,何必搞這麼複雜?別著急,好戲在後面。

由於inte***ce的限制,修改類的方法被限定在了create()方法中,因此可以避免偷懶的程式設計師新增加的不合理函式。

簡單修改一下:

<?php

class whale implements animal

}class carp implements animal

}?>

由於物件是由工廠造出來的,外部不可能直接呼叫或者修改類的實現,類的修改被限定在了類的對外介面上。這樣的架構易於擴充套件。

工廠模式的靈活,在於可以只擁有乙個工廠,卻能生產多個類/產品。

修改我們的抽象工廠,給create()方法增加animal介面:

<?php

abstract class factory

}?>

然後合併之前的鯨魚工廠和鯉魚工廠:

<?php

class animalfactory extends factory

}?>

修改使用工廠建立鯨魚和鯉魚的**:

<?php

$animalfactory = new animalfactory();

echo $animalfactory->factorystart(new whale());

echo $animalfactory->factorystart(new carp());

?>

執行一下:

whale is created. whale eats fish.

carp is created. carp eats moss.

鯨魚類和鯉魚類源源不斷的從乙個工廠中被建立出來了。通過這種設計模式,類的建立過程統一通過乙個介面來實現,介面外部並不需要關心類是如何被建立出來的,而介面內部實現也得到了很好的拓展性。

本文介紹了工廠設計模式,使用這種設計模式,可以讓你通過乙個或多個工廠的介面,建立無數新類,呼叫任意類的方法。由於介面嚴格定義了新類/產品的形態,因此在維護和拓展的時候,可以省去不少力氣。

php八大設計模式之工廠模式

簡單點來說,就是用到什麼類,就去例項化對應的類。比如 php 可能連線 mysql,可能連線 sqlserver,也可能是 oracle 資料庫,可以動態的去鏈結。書籍來,看實際 比如我們在 like 目錄下有一些鏈結資料庫的類 like mysql.php class mysql like ora...

php八大設計模式之工廠模式

簡單點來說,就是用到什麼類,就去例項化對應的類。比如 php 可能連線 mysql,可能連線 sqlserver,也可能是 oracle 資料庫,可以動態的去鏈結。書籍來,看實際 比如我們在 like 目錄下有一些鏈結資料庫的類 like mysql.php class mysql like ora...

PHP設計模式 工廠模式

使用工廠模式使得在呼叫方法時變得更容易,因為它只有乙個類和乙個方法,若沒有使用工廠模式,則要在呼叫時決定應該呼叫哪個類和哪個方法 使用工廠模式還使得未來對應用程式做改變時更加容易 比如要增加一種形狀的支援,只需要修改工廠類中的create 乙個方法,而沒有使用工廠模式,則要修改呼叫形狀的 塊。定義形...