首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 設計模式深度解析:抽象工廠模式(Abstract Factory)

     編輯:Java 綜合教學

Java 設計模式深度解析:抽象工廠模式(Abstract Factory)

閱讀提示:本文較長,結合 UML 類圖與完整代碼講解,耐心閱讀定能掌握。

模式定位

屬於創建型模式。適用場景:產品族固定(如電腦),但產品線多變(不同配置)。例如電腦廠商生產多款電腦,每款由 CPU、主板、內存組成,具體品牌型號不同。

UML 角色對應

  • ComputerFactory → AbstractFactory
  • CPU/MainBoard/RAM → ProductA/B/C
  • I3CPU/I5CPU 等 → ProductA1/A2…
  • Computer1/Computer2 → Factory1/Factory2

代碼實現(核心片段)

抽象工廠與產品接口

public 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();
    }
}

擴展新產品線(Computer3:i7 + 華碩 + 金士頓)

  1. 新增 I7CPU 實現 CPU 接口。
  2. 新增 Computer3 繼承 ComputerFactory,組裝新配置。
  3. 測試類中實例化 Computer3 即可,無需修改現有代碼。

優缺點總結

優點缺點
接口與實現分離,切換產品線極其靈活類數量爆炸式增長
新增產品線(工廠)只需添加類,符合開閉原則新增產品類型(如加硬盤)需修改抽象工廠及所有具體工廠,違反開閉原則

適用場景判斷

當產品族穩定、產品線頻繁擴展時首選;若產品類型也常變,建議考慮建造者模式或原型模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved