在工廠方法模式中,創建產品類完全依賴於工廠類本身,一旦有擴展需求,就必須對工廠類進行修改,這其實是違背設計原則中的閉包原則的,因此,在設計思路存在瑕疵。解決這一問題,就得用到本文中將詳述的抽象工廠模式。即抽取工廠類接口,創建多個工廠類,這樣如有新需要增加的功能,可以直接增加新的工廠類,不需要修改現存代碼。先看下面類圖:
詳細代碼如下:
首先建立一個共同接口
public interface Connector { public boolean connect(String url); }
接着建立兩個上面接口的實現類
public class Bluetooch implements Connector { @Override public boolean connect(String url) { System.out.println(String.format("%s.%s called!",this.getClass().getName(),"connect()")); return false; } }
public class Httprequest implements Connector { @Override public boolean connect(String url) { System.out.println(String.format("%s.%s called!",this.getClass().getName(),"connect()")); return false; } }然後提供一個工廠類接口
public interface Producer { public Connector produce(); }
之後就可以根據需要增加工廠類
public class BluetoochFactory implements Producer { @Override public Connector produce() { return new Bluetooch(); } }
public class HttprequestFactory implements Producer { @Override public Connector produce() { return new Httprequest(); } }最後測試類
public class WorkClass { public void test() { Producer producer = new BluetoochFactory(); Connector connectorBluetooch = producer.produce(); connectorBluetooch.connect("bluetooch://"); } }
輸出:
designpattern.creator.Bluetooch.connect() called!抽象工廠模式的優勢不言自明,可擴展性強,對於一些新增加功能,比如,新增加Socket通信類只需要做一個實現類實現Connector接口,再同時做一個工廠類,實現Producer 接口,完工!無需去改動已有的代碼。