閱讀提示:本文較長,結合 UML 類圖與完整代碼講解,耐心閱讀定能掌握。
屬於創建型模式。適用場景:產品族固定(如電腦),但產品線多變(不同配置)。例如電腦廠商生產多款電腦,每款由 CPU、主板、內存組成,具體品牌型號不同。
ComputerFactory → AbstractFactoryCPU/MainBoard/RAM → ProductA/B/CI3CPU/I5CPU 等 → ProductA1/A2…Computer1/Computer2 → Factory1/Factory2public abstract class ComputerFactory {
public abstract CPU createCPU();
public abstract MainBoard createMainBoard();
public abstract RAM createRAM();
}
public interface CPU { void cpu(); }
public interface MainBoard { void mainboard(); }
public interface RAM { void ram(); }
public class I3CPU implements CPU { public void cpu() { System.out.println("i3處理器"); } }
public class I5CPU implements CPU { public void cpu() { System.out.println("i5處理器"); } }
public class LenovoMainBoard implements MainBoard { public void mainboard() { System.out.println("聯想主板"); } }
public class ASUSMainBoard implements MainBoard { public void mainboard() { System.out.println("華碩主板"); } }
public class SamsungRAM implements RAM { public void ram() { System.out.println("三星內存"); } }
public class KingStoneRAM implements RAM { public void ram() { System.out.println("金士頓內存"); } }
public class Computer1 extends ComputerFactory {
@Override public CPU createCPU() { return new I3CPU(); }
@Override public MainBoard createMainBoard() { return new LenovoMainBoard(); }
@Override public RAM createRAM() { return new SamsungRAM(); }
}
public class Computer2 extends ComputerFactory {
@Override public CPU createCPU() { return new I5CPU(); }
@Override public MainBoard createMainBoard() { return new ASUSMainBoard(); }
@Override public RAM createRAM() { return new KingStoneRAM(); }
}
public class TestFactory {
public static void main(String[] args) {
ComputerFactory cf1 = new Computer1();
System.out.println("組裝產品類型1:");
cf1.createCPU().cpu();
cf1.createMainBoard().mainboard();
cf1.createRAM().ram();
ComputerFactory cf2 = new Computer2();
System.out.println("組裝產品類型2:");
cf2.createCPU().cpu();
cf2.createMainBoard().mainboard();
cf2.createRAM().ram();
}
}
I7CPU 實現 CPU 接口。Computer3 繼承 ComputerFactory,組裝新配置。Computer3 即可,無需修改現有代碼。| 優點 | 缺點 |
|---|---|
| 接口與實現分離,切換產品線極其靈活 | 類數量爆炸式增長 |
| 新增產品線(工廠)只需添加類,符合開閉原則 | 新增產品類型(如加硬盤)需修改抽象工廠及所有具體工廠,違反開閉原則 |
當產品族穩定、產品線頻繁擴展時首選;若產品類型也常變,建議考慮建造者模式或原型模式。