Head First 設計模式之工廠模式(Java例子)

前言:

來源於《head first 設計模式》。當作讀書筆記了,這次看的是第四章裝工廠模式。其實這一章前幾天就看完了,拖延癌晚期,沒整理,今天就來填一下坑吧。

抽象工廠模式的概念

提供一個接口用於創建相關或者依賴對象的家族,並不需要明確指定具體類

工廠方法模式的概念

定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類

注意:上述所寫的接口並不是java中的接口,可以是抽象類也可以是java中的接口噢,大家別誤解了。
在正式進入上述兩個模式學習之前,我們先來了解一下簡單工廠。
簡單工廠不是一個設計模式,僅僅是一種變成習慣而已,那麼什麼是簡單工廠模式呢?來看例子:
假設你有一個披薩店,那麼一開始你可能會這樣子寫:

public class PizzaStore {
     public Pizza orderPizza(String type) {
     	Pizza pizza=new Pizza();
     	if(type.equals("cheeese")){
     		pizza=new CheesePizza();
     	}else if(type.equals("greek")){
     		pizza=new GreekPizza();
     	}
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

但是如果我們需要更多的類型的披薩呢??我們就需要修改該代碼不斷的加入if else語句了。 此時的我們可以發現代碼後期會修改的部分就是披薩的類型,這時候該是時候使用封裝了

  • 定義一個簡單的工廠
public class SimplePizzaFactory {
	public Pizza createPizza(String type) {
		Pizza pizza = null;
		if (type.equals("cheese")) {
			pizza = new CheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		} else if (type.equals("clam")) {
			pizza = new ClamPizza();
		} else if (type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}
  • 修改披薩店的代碼
public class PizzaStore {
	 SimplePizzaFactory factory;
     public Pizza orderPizza(String type) {
     	Pizza pizza;
     	pizza=factory.createPizza(type);
     	pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

這樣就完成了一個簡單工廠,披薩簡單工廠負責處理pizza生成的細節。披薩店鋪負責處理披薩打包切割準備的細節。這樣可以如果需要修改pizza的種類,則無需去披薩店鋪類中修改,只需對對症下藥去工廠處修改即可。簡單工廠用法在於將功能分化,利於後期的版本迭代。
熱身完畢!進入工廠方法模式以及抽象工廠方法模式的學習把!

工廠方法模式

還是披薩店=。=,現在有兩個分店噢,一個紐約披薩店,一個芝加哥披薩店,如果再用簡單工廠方法,就需要在簡單工廠裏面再做修改=。=,不能讓每個地區的門店自由修改他們的風味。
這時候工廠方法登場啦

  • 聲明一個工廠方法
public abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		Pizza pizza;
 		createPizza(type);
 		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	protected abstract Pizza createPizza(String type);
}
  • 創建地區分店

public class NYPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
		if (item.equals("cheese")) {
			return new NYStyleCheesePizza();
		} else if (item.equals("veggie")) {
			return new NYStyleVeggiePizza();
		} else if (item.equals("clam")) {
			return new NYStyleClamPizza();
		} else if (item.equals("pepperoni")) {
			return new NYStylePepperoniPizza();
		} else return null;
	}
}

調用代碼

public static void main(String[] args) {
		PizzaStore nyStore = new NYPizzaStore();
		//PizzaStore chicagoStore = new ChicagoPizzaStore();
 
		Pizza pizza = nyStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");

看一下uml圖
在這裏插入圖片描述
這就是工廠模式的體現:讓子類決定要實例的類是哪一個?即生產出怎麼樣的產品。即讓地方披薩店自己做主,來實現披薩的生成。
接下來貼出真正的工廠模式的uml圖。
在這裏插入圖片描述
對比我們的披薩店uml圖其實就是多了點產品的uml圖而已,基本都是一樣,加了一條具體工廠依賴與具體的產品。總結就是工廠方法模式將具體的實現放在子類之中,僅僅提供一個抽象方法規範。

抽象工廠方法模式

老披薩店了,,,,這次加入了原料的問題,不同的地域需要使用不同的原料
如果理解了上門工廠方法再來理解這個應該不難。
直接給出抽象方法模式的uml圖,。
在這裏插入圖片描述
這裏偷懶啦。其實抽象工廠模式就是提供一個接口,用於創建相關的一組相關產品,其實抽象工廠的方法經常以工廠方法來進行實現,抽象工廠的任務就是定義一個負責創造一組產品的接口,這個接口裏的每個方法都負責創造一個具體產品,我們利用實現抽象工廠的子類來提供這些具體的做法,所以在抽象工廠中利用工廠方法實現生成方法是自然的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章