《Head First 設計模式》學習中 分類 簡單工廠模式(Simple Factory) 工廠方法模式(Factory Method) 抽象工廠模式(Abstract Factory) 介紹 簡單工廠模式: 簡單工廠其實並不是一個設計模式,反而比較像是一種編程習慣,但是由於經常被使用,所以才被稱 ...
《Head First 設計模式》學習中
分類
- 簡單工廠模式(Simple Factory)
- 工廠方法模式(Factory Method)
- 抽象工廠模式(Abstract Factory)
介紹
- 簡單工廠模式:
簡單工廠其實並不是一個設計模式,反而比較像是一種編程習慣,但是由於經常被使用,所以才被稱為簡單工廠模式,你可以把它看為工廠模式的一種特例,但是不能因為它不是一個真正的設計模式,就忽略它。
- 工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
- 抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
- 區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
簡單工廠類圖
簡單工廠實例
產品類
package com.Observer.model; public class food { public food(){ } }
具體產品類
package com.Observer.model; public class ChickenPot extends food { public ChickenPot(){ System.out.println("黃燜雞"); } }
package com.Observer.model; public class Noodles extends food { public Noodles(){ System.out.println("砂鍋速食麵"); } }
工廠類
package com.Observer.model; public class SimpleFoodFactory { public food create(String type){ if(type.equals("黃燜雞")){ return new ChickenPot(); }else if(type.equals("砂鍋速食麵")){ return new Noodles(); } return null; } }
測試類
package com.Observer.model; public class Test { public static void main(String[] args) { SimpleFoodFactory factory = new SimpleFoodFactory(); food food = factory.create("砂鍋速食麵"); food food1 = factory.create("黃燜雞"); } }
輸出結果:
砂鍋速食麵 黃燜雞
簡單工廠的優勢:
如果以後要實現改變的時候,只需要修改工廠類就可以
工廠模式實例:
利用簡單工廠開的飯店太紅火了,引來了兩個代理商,因為我們的代碼處理方便使用,所以他們想使用我們的代碼來確保質量。這樣我們就可以使用工廠模式
產品類:
package com.Observer.model; public abstract class food { public food(){ } }
具體產品類
package com.Observer.model; public class ChickenPot extends food { public ChickenPot(String name){ System.out.println(name + " :黃燜雞"); } }
package com.Observer.model; public class Noodles extends food { public Noodles(String name){ System.out.println(name + " :砂鍋速食麵"); } }
工廠介面
package com.Observer.model; public interface factoryFood { food create(String type); }
工廠實現類
package com.Observer.model; /** * 通州店 * @author Administrator * */ public class TongFood implements factoryFood { @Override public food create(String type) { if (type.equals("黃燜雞")) { return new ChickenPot("通州分店"); } else if (type.equals("砂鍋速食麵")) { return new Noodles("通州分店"); } return null; } }
package com.Observer.model; /** * 昌平店 * @author Administrator * */ public class ChangFood implements factoryFood { @Override public food create(String type) { if (type.equals("黃燜雞")) { return new ChickenPot("昌平分店"); } else if (type.equals("砂鍋速食麵")) { return new Noodles("昌平分店"); } return null; } }
測試類
package com.Observer.model; public class Test { public static void main(String[] args) { factoryFood factory = new TongFood(); factory.create("黃燜雞"); factoryFood factory1 = new ChangFood(); factory1.create("砂鍋速食麵"); } }
輸出結果:
通州分店 :黃燜雞 昌平分店 :砂鍋速食麵
工廠方法模式:
定義了一個創建對象的介面,但由子類決定要實例化的類是哪一個,工廠方法讓類把實例化推遲到子類
參考: http://blog.csdn.net/jason0539/article/details/23020989