每天一個設計模式-6 抽象工廠模式 1.生活的例子 組裝CPU主板時需要針腳匹配,那麼CPU和主板之間就有了關係,這也是和工廠方法模式的區別;抽象工廠的功能是為一系列相關對象或相互依賴的對象創建一個藉口,對象之間存在約束。工廠方法則是創建單個產品對象。 2.抽象工廠的定義 提供一個創建一系列相關或相 ...
每天一個設計模式-6 抽象工廠模式
1.生活的例子
組裝CPU主板時需要針腳匹配,那麼CPU和主板之間就有了關係,這也是和工廠方法模式的區別;抽象工廠的功能是為一系列相關對象或相互依賴的對象創建一個藉口,對象之間存在約束。工廠方法則是創建單個產品對象。
2.抽象工廠的定義
提供一個創建一系列相關或相互依賴對象的介面(產品簇),而無需指定他們具體的類。
3.抽象工廠實現CPU與主板的搭配
類圖:
AbstractFactory介面:聲明創建CPU和創建主板。
Schema1:(方案一)呼應前面說的產品簇,在這裡定義匹配的主板和CPU.。
Schema2:同上。
MainboardApi介面:聲明安裝主板的介面。
MSIMainboard:MainboardApi的一個實現。
GAMainboard:MainboardApi的一個實現。
。。。。
ComputerEngineer:裝機工程師類,通過用戶選擇裝機方案,裝機工程師調用抽象工廠完成用戶需求。
4.源代碼
抽象工廠介面:
public interface AbstractFactory { public CPUApi createCPUApi(); public MainboardApi createMainboardApi(); }AbstractFactory
方案一:
public class Schema1 implements AbstractFactory { public Schema1(){ } public void finalize() throws Throwable { } public CPUApi createCPUApi(){ System.out.println("啟用裝機方案:"+this.getClass().getName()); return new AMDCPU(939); } public MainboardApi createMainboardApi(){ System.out.println("啟用裝機方案:"+this.getClass().getName()); return new MSIMainboard(939); } }Schema1
方案二:
public class Schema2 implements AbstractFactory { public Schema2(){ } public void finalize() throws Throwable { } public CPUApi createCPUApi(){ System.out.println("啟用裝機方案:"+this.getClass().getName()); return new TntelCPU(1156); } public MainboardApi createMainboardApi(){ System.out.println("啟用裝機方案:"+this.getClass().getName()); return new GAMainboard(1156); } }Schema2
主板介面:
public interface MainboardApi { public void installCPU(); }MainboardApi
主板的兩個實現類:
public class GAMainboard implements MainboardApi { private int cpuHoles; public GAMainboard(int cpuHoles){ this.cpuHoles = cpuHoles; } public void finalize() throws Throwable { } public void installCPU(){ System.out.println("此主板的支持的CPU針腳數為:"+cpuHoles+",開始安裝"); } }GAMainboard
public class MSIMainboard implements MainboardApi { private int cpuHoles; public MSIMainboard(int cpuHoles){ this.cpuHoles = cpuHoles; } public void finalize() throws Throwable { } public void installCPU(){ System.out.println("此主板的支持的CPU針腳數為:"+cpuHoles+",並且開始安裝"); } }MSIMainboard
CPU介面:
public interface CPUApi { public void calculate(); }CPUApi
CPU的兩個實現類:
public class AMDCPU implements CPUApi { private int pins; public AMDCPU(int pins){ this.pins = pins; } public void finalize() throws Throwable { } public void calculate(){ System.out.println("使用AMDCPU進行計算"); } }AMDCPU
public class TntelCPU implements CPUApi { private int PINS; public TntelCPU(int pins){ PINS = pins; } public void finalize() throws Throwable { } public void calculate(){ System.out.println("使用IntelCPU進行計算"); } }TntelCPU
工程師類:
public class ComputerEngineer { private CPUApi cpu; private MainboardApi mainboard; public ComputerEngineer(){ } public void finalize() throws Throwable { } public void makeComputer(AbstractFactory schema){ //準備硬體 prepareHardwares(schema); } private void prepareHardwares(AbstractFactory schema){ //根據裝機方案選擇對應的CPU和主板 this.cpu=schema.createCPUApi(); this.mainboard=schema.createMainboardApi(); //測試 this.cpu.calculate(); this.mainboard.installCPU(); } }ComputerEngineer
客戶類:
public class Client { public static void main(String[] args) { //通過抽象工廠制定裝機方案,此時的抽象工廠就像一個方案 AbstractFactory schema = new Schema1(); //構造一個裝機工程師 ComputerEngineer engineer = new ComputerEngineer(); //工程師裝配電腦 engineer.makeComputer(schema); } }Client
測試結果:
啟用裝機方案:Schema1
啟用裝機方案:Schema1
使用AMDCPU進行計算
此主板的支持的CPU針腳數為:939,並且開始安裝
一個抽象工廠就像一個裝機方案,也就是這個抽象工廠創建了正確的CPU與主板的匹配。
5.抽象工廠的優缺點
優點:
分離介面和實現:客戶端使用抽象工廠來創建需要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的介面編程而已。
切換產品簇變得容易:客戶只需選擇不同的裝機方案即可切換不同的產品簇。
缺點:
不太容易擴展新的產品:如果需要給全部的產品添加一個新的產品簇,那麼就需要修改抽象工廠,這樣會導致修改所有的工廠實現類。
6.總結
抽象工廠的本質:選擇產品簇的實現。即:提供一個創建一系列相關或相互依賴的對象的介面(產品簇)。通過抽象工廠,將互相約束的對象封裝起來,使客戶端不能隨意選擇對象,防止出現對象間不匹配的問題。
博主寫博客不容易,轉載請註明出處,謝謝: http://www.cnblogs.com/xiemubg/p/5990656.html