簡單工廠
簡單工廠一開始真的很簡單
public class MaskFactory { public Mask createMask() { Mask mask = new Mask(); // ..... // 100行初始化代碼 return mask; } }
口罩工廠類只需要new一個口罩對象,配置好,返回即可
但假如我們需要口罩類的子類,就會比較判斷,變成了要加if-else了
假設口罩類是個接口,有兩個子類“高端口罩”和“低端口罩”分別實現了這個接口:
public interface IMask { void show(); } public class HighEndMask implements IMask { @Override public void show() { System.out.println("我是高端口罩"); } } public class LowEndMask implements IMask { @Override public void show(){ System.out.println("我的低端口罩"); } }
在工廠中(還是口罩工廠),通過加if-else判斷來生產對象
public class MaskFactory{ public IMask createMask(String type) { IMask mask = null; if("高端口罩".equals(type)){ mask = new HighEndMask(); // ..... // HighEndMask的100行初始化代碼 }else if("低端口罩".equals(type)){ mask = new LowEndMask(); // ..... // LowEndMask的100行初始化代碼 } return mask; } }
客戶端傳遞字符串參數,枚舉什麼的,都行
public class Test { public static void main(String[] args) { MaskFactory factory = new MaskFactory(); IMask maskA = factory.createMask("高端口罩"); IMask maskB = factory.createMask("低端口罩"); maskA.show(); maskB.show(); } }
不過這違反了開閉原則,對“擴展”開放,對“修改”封閉
工廠方法模式
每一個口罩子類都對應一個工廠的子類
public interface IMaskFactory { IMask createMask(); } public class HighEndFactory implements IMaskFactory{ @Override public IMask createMask() { IMask mask = new HighEndMask(); // ..... // HighEndMask的100行初始化代碼 return mask; } } public class LowEndFactory implements IMaskFactory{ @Override public IMask createMask() { IMask mask = new LowEndMask(); // ..... // LowEndMask的100行初始化代碼 return mask; } }
客戶端調不同的工廠即可
public class Test { public static void main(String[] args) { IMaskFactory factoryA = new LowEndFactory(); IMaskFactory factoryB = new HighEndFactory(); IMask maskA = factoryA.createMask(); IMask maskB = factoryB.createMask(); maskA.show(); maskB.show(); } }
這一看就感覺一眼難盡。。。
抽象工廠
https://zhuanlan.zhihu.com/p/243277598
等等再寫