工廠模式是一種類,它具備爲您建立對象的某些方法。您能夠使用工廠類建立對象,而不直接使用 new。這樣,若是您想要更改所建立的對象類型,只需更改該工廠便可。使用該工廠的全部代碼會自動更改。編程
1.簡單工廠模式(靜態工廠模式):經過靜態方法來建立對象
2.工廠模式:定義一個對象接口,讓子類來決定具體的對象實例化
3.抽象工廠模式:使用對象組合來,對象的建立被實如今工廠接口所暴露的出來的方法設計模式
/** * 簡單工廠模式:經過靜態方法來實現對象建立 * Interface Drink */ interface Drink{ public function buy(); } class Coffee implements Drink { public function buy(){ echo "i want to coffee"; } } class Cola implements Drink{ public function buy() { echo "i want to cola"; } } class DrinkStore{ public static function orderCoffee(){ return new Coffee(); } public static function orderCola(){ return new Cola(); } } $man = DrinkStore::orderCoffee(); $man->buy();//結果輸出 i want to coffee echo "<br/>"; $woman = DrinkStore::orderCola(); $woman->buy();//結果輸出 i want to cola
/** * 工廠模式:經過定義一個對象的接口,讓子類來實現對象建立 * Interface Drink */ interface Drink{ public function buy(); } class Coffee implements Drink { public function buy(){ echo "i want to coffee"; } } class Cola implements Drink{ public function buy() { echo "i want to cola"; } } interface CreateDrink{ public function create(); } class CoffeeFactory implements CreateDrink{ public function create() { return new Coffee(); } } class ColaFactory implements CreateDrink{ public function create() { return new Cola(); } } $coffee_factory = new CoffeeFactory(); $man = $coffee_factory->create(); $man->buy();//結果輸出 i want to coffee echo "<br/>"; $cola_factory = new ColaFactory(); $woman = $cola_factory->create(); $woman->buy();//結果輸出 i want to cola
/** * 抽象工廠模式:提供一個建立一系列的相關的或者相互依賴的對象接口 * 注意:這裏和工廠方法的區別是:一系列,而工廠方法則是一個 * Interface Drink */ interface Drink{ public function buy(); } class CoffeeHot implements Drink { public function buy(){ echo "i want to hot coffee"; } } class CoffeeCold implements Drink { public function buy(){ echo "i want to cold coffee"; } } class ColaHot implements Drink{ public function buy() { echo "i want to hot cola"; } } class ColaCold implements Drink{ public function buy() { echo "i want to cold cola"; } } interface SuperFactory{ public function createHot(); public function createCold(); } class CoffeeFactory implements SuperFactory { public function createHot() { return new CoffeeHot(); } public function createCold() { return new CoffeeCold(); } } class ColaFactory implements SuperFactory{ public function createCold() { return new ColaCold(); } public function createHot() { return new ColaHot(); } } $coffee_factory = new CoffeeFactory(); $man = $coffee_factory->createHot(); $man->buy();
1.多用組合,少用繼承
2.針對接口編程,不針對實現編程
3.爲交互對象之間的鬆耦合設計而努力
4.類應該對擴展開發,對修改關閉
5.依賴抽象,不要依賴具體類設計
1.全部工廠都是用來封裝對象的建立
2.簡單工廠,雖然不是真正的設計模式,但仍不失爲一種簡單的方法,能夠將客戶程序從具體的類中解耦
3.工廠方法使用繼承,把對象的建立委託給子類,子類實現工廠方法來建立對象
4.抽象工廠使用對象組合,對象的建立被是如今工廠接口所暴露出來的地方中
5.所用工廠模式都在經過減小應用程序具體類之間的依賴所促進鬆耦合
6.工廠方法容許類將實例化延遲到子類中
7.抽象工廠建立相關的對象家族,而不須要依賴他們的具體類code