Java设计模式及应用场景之《抽象工厂模式》
文章目錄
- 一、抽象工廠模式定義
- 二、抽象工廠模式的結構和說明
- 三、應用抽象工廠模式來解決問題的思路
- 四、抽象工廠模式示例
- 五、抽象工廠模式的優缺點
- 六、用反射機制+簡單工廠模式改進代碼
- 七、抽象工廠模式的應用場景
一、抽象工廠模式定義
? ?抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。
? ?在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
二、抽象工廠模式的結構和說明
- AbstractFactory 抽象工廠,定義創建系列產品對象的操作接口。
- ConcreteFactory 具體的工廠,實現抽象工廠定義的方法,具體實現系列產品對象的創建。
- AbstractProduct 產品對象接口。
- Product 實現產品對象接口的實現類。
三、應用抽象工廠模式來解決問題的思路
? ?創建一系列的產品對象,而且這一系列對象是構成新的對象所需要的組成部分,也就是這一系列被創建的對象相互之間是有關聯的。
? ?解決這個問題的一個解決方案就是抽象工廠模式。在這個模式里,會定義一個抽象工廠,在里邊虛擬的創建客戶端需要的這一系列對象,所謂虛擬的就是定義創建這些對象的抽象方法,并不去真正的實現,然后由具體的抽象工廠的子類來提供這一系列對象的創建。這樣一來,可以為同一個抽象工廠提供很多不同的實現,那么創建的這一系列對象也就不同了。
四、抽象工廠模式示例
??假設鼠標和鍵盤是我們需要的產品,生產鼠標和鍵盤的戴爾和聯想是我們的工廠。
1、創建鼠標接口和具體的鼠標實現類
Mouse.java
/*** 鼠標接口*/ public interface Mouse {/*** 點擊鼠標*/public void click(); }DellMouse.java
/*** 戴爾鼠標*/ public class DellMouse implements Mouse {@Overridepublic void click() {System.out.println("使用戴爾鼠標進行點擊...");}}LenovoMouse.java
/*** 聯想鼠標*/ public class LenovoMouse implements Mouse {@Overridepublic void click() {System.out.println("使用聯想鼠標進行點擊...");}}2、創建鍵盤接口和具體的鍵盤實現類
Keyboard.java
/*** 鍵盤接口*/ public interface Keyboard {/*** 使用鍵盤打字*/public void type(); }DellKeyboard.java
/*** 戴爾鍵盤*/ public class DellKeyboard implements Keyboard {@Overridepublic void type() {System.out.println("使用戴爾鍵盤打字...");}}LenovoKeyboard.java
/*** 聯想鍵盤*/ public class LenovoKeyboard implements Keyboard {@Overridepublic void type() {System.out.println("使用聯想鍵盤打字...");}}3、創建獲取鼠標對象和鍵盤對象的抽象工廠
AbstractFactory.java
/*** 抽象工廠的接口,聲明創建抽象產品對象的操作*/ public interface AbstractFactory {/*** 創建鼠標對象* @return*/public Mouse createMouse();/*** 創建鍵盤對象* @return*/public Keyboard createKeyboard(); }4、創建實現了抽象工廠的子工廠:戴爾工廠和聯想工廠
DellFactory.java
/*** 戴爾工廠,生產戴爾鼠標和鍵盤*/ public class DellFactory implements AbstractFactory {@Overridepublic Mouse createMouse() {return new DellMouse();}@Overridepublic Keyboard createKeyboard() {return new DellKeyboard();}}LenovoFactory.java
/*** 聯想工廠,生產聯想鼠標和鍵盤*/ public class LenovoFactory implements AbstractFactory {@Overridepublic Mouse createMouse() {return new LenovoMouse();}@Overridepublic Keyboard createKeyboard() {return new LenovoKeyboard();}}5、在客戶端用的時候,就可以這樣用:
public class Client {public static void main(String[] args) {// 使用戴爾工廠AbstractFactory af = new DellFactory();Mouse m = af.createMouse();Keyboard kb = af.createKeyboard();m.click(); // 使用戴爾鼠標進行點擊...kb.type(); // 使用戴爾鍵盤打字...// 更換為聯想工廠af = new LenovoFactory();m = af.createMouse();kb = af.createKeyboard();m.click(); // 使用聯想鼠標進行點擊...kb.type(); // 使用聯想鍵盤打字...} }五、抽象工廠模式的優缺點
?優點:
- 分離接口和實現。客戶端面向產品的接口編程,從具體的產品實現中解耦。
- 可以很方便的生產或切換產品系列。
?缺點:
- 不太容易擴展新產品。假如我們要給產品系列添加新的產品耳麥,那么就需要修改抽象工廠,這樣就會導致修改所有的工廠實現類。
六、用反射機制+簡單工廠模式改進代碼
??我們將AbstractFactory、DellFactory以及LenovoFactory三個工廠類拋棄掉。取而代之的是一個簡單工廠類SimpleFactory。
1、創建簡單工廠
SimpleFactory.java
/*** 簡單工廠,生產鼠標和鍵盤*/ public class SimpleFactory {// 包名(此處getProperty方法為從配置文件中獲取數據)private static String packName = getProperty("packName");// 具體需要的產品系列類型//(此處getProperty方法為從配置文件中獲取數據)private static String type = getProperty("type");/*** 創建需要的鼠標對象* @return* @throws Exception*/public static Mouse createMouse() throws Exception {String className = packName + "." + type + "Mouse";return (Mouse)Class.forName(className).newInstance();}/*** 創建需要的鍵盤對象* @return* @throws Exception*/public static Keyboard createKeyboard() throws Exception{String className = packName + "." + type + "Keyboard";return (Keyboard)Class.forName(className).newInstance();}}2、配置文件中
packName=com.abstractfactory.example type=Dell
3、在客戶端用的時候,就可以這樣用:
public class Client {public static void main(String[] args) throws Exception {Mouse m = SimpleFactory.createMouse();Keyboard kb = SimpleFactory.createKeyboard();m.click(); // 使用戴爾鼠標進行點擊...kb.type(); // 使用戴爾鍵盤打字...} }這樣,如果我們需要更換產品系列,就可以不用修改和編譯代碼,直接修改配置文件就可以了。
七、抽象工廠模式的應用場景
- 系統中有多于一個的產品族,而每次只使用其中某一產品族。
- 在很多軟件系統中需要更換界面主題或者一鍵換膚。
- DAO層支持多種類型的數據庫,動態切換時。
- 不同操作系統代碼差異化,可以切換不同操作系統時。
總結
以上是生活随笔為你收集整理的Java设计模式及应用场景之《抽象工厂模式》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash cs3下停止movieCli
- 下一篇: Createjs的控件 BitMap、M