《研磨设计模式》chap7 抽象工厂 Abstract Factory
場景:配電腦,多種CPU、主板
1. 正常編碼
1.1 cpu
IntelCPU:
//Intel的CPU實現 public class IntelCPU implements CPUApi{ private int pins = 0;//CPU的針腳數目 //構造方法,傳入CPU的針腳數目 public IntelCPU(int pins){this.pins = pins;} public void calculate() {System.out.println("now in Intel CPU,pins="+pins);} }AMDCPU:
public class AMDCPU implements CPUApi{private int pins = 0;//CPU的針腳數目//構造方法,傳入CPU的針腳數目 public AMDCPU(int pins){this.pins = pins;}public void calculate() {System.out.println("now in AMD CPU,pins="+pins);} }1.2 主板
//主板的接口 public interface MainboardApi {//示意方法,主板都具有安裝CPU的功能 public void installCPU(); }技嘉主板
public class GAMainboard implements MainboardApi { private int cpuHoles = 0;// CPU插槽的孔數 public GAMainboard(int cpuHoles){ //構造方法,傳入CPU插槽的孔數this.cpuHoles = cpuHoles;}public void installCPU() {System.out.println("now in GAMainboard,cpuHoles="+cpuHoles);} }微星主板
public class MSIMainboard implements MainboardApi{ private int cpuHoles = 0; //CPU插槽的孔數 //構造方法,傳入CPU插槽的孔數 public MSIMainboard(int cpuHoles){this.cpuHoles = cpuHoles;}public void installCPU() {System.out.println("now in MSIMainboard,cpuHoles="+cpuHoles);} }1.3 創建CPU和主板的工廠:
//創建CPU的簡單工廠 public class CPUFactory {//創建CPU接口對象的方法 public static CPUApi createCPUApi(int type){CPUApi cpu = null;//根據參數來選擇并創建相應的CPU對象if(type==1){cpu = new IntelCPU(1156);}else if(type==2){cpu = new AMDCPU(939);}return cpu;} }//創建主板的簡單工廠 public class MainboardFactory {//創建主板接口對象的方法 public static MainboardApi createMainboardApi(int type){MainboardApi mainboard = null;//根據參數來選擇并創建相應的主板對象if(type==1){mainboard = new GAMainboard(1156);}else if(type==2){mainboard = new MSIMainboard(939);}return mainboard;} }1.4 工程師
public class ComputerEngineer { private CPUApi cpu= null;//定義組裝機器需要的CPU private MainboardApi mainboard = null;//定義組裝機器需要的主板//裝機過程 public void makeComputer(int cpuType,int mainboardType){//1:首先準備好裝機所需要的配件prepareHardwares(cpuType,mainboardType);//2:組裝機器 //3:測試機器 //4:交付客戶}//準備裝機所需要的配件 private void prepareHardwares(int cpuType,int mainboardType){//這里要去準備CPU和主板的具體實現,為了示例簡單,這里只準備這兩個//可是,裝機工程師并不知道如何去創建,怎么辦呢?//直接找相應的工廠獲取this.cpu = CPUFactory.createCPUApi(cpuType);this.mainboard = MainboardFactory.createMainboardApi(mainboardType);//測試一下配件是否好用this.cpu.calculate();this.mainboard.installCPU();} }client:
public static void main(String[] args) {//創建裝機工程師對象ComputerEngineer engineer = new ComputerEngineer();//告訴裝機工程師自己選擇的配件,讓裝機工程師組裝電腦engineer.makeComputer(1,2);}2. 運用抽象工廠模式
- 定義了一個產品族
比如有2種主板、2種cpu,然后按照工廠模式,可以為create(MainBoardType, CPUType ), 但是現在主板和cpu必須配套。因此有主題。
//抽象工廠的接口,聲明創建抽象產品對象的操作 public interface AbstractFactory {//示例方法,創建抽象產品A的對象 public AbstractProductA createProductA();//示例方法,創建抽象產品B的對象 public AbstractProductB createProductB(); } public class Schema1 implements AbstractFactory{public CPUApi createCPUApi() {return new IntelCPU(1156);}public MainboardApi createMainboardApi() {return new GAMainboard(1156);} } //裝機工程師的類 public class ComputerEngineer { private CPUApi cpu= null;//定義組裝機器需要的CPU private MainboardApi mainboard = null;// 定義組裝機器需要的主板public void makeComputer(AbstractFactory schema){//裝機過程//1:首先準備好裝機所需要的配件prepareHardwares(schema);//2:組裝機器//3:測試機器//4:交付客戶}//準備裝機所需要的配件 private void prepareHardwares(AbstractFactory schema){//這里要去準備CPU和主板的具體實現,為了示例簡單,這里只準備這兩個//可是,裝機工程師并不知道如何去創建,怎么辦呢?//使用抽象工廠來獲取相應的接口對象this.cpu = schema.createCPUApi();this.mainboard = schema.createMainboardApi();//測試一下配件是否好用this.cpu.calculate();this.mainboard.installCPU();} }2. 新增加內存的使用
public class Schema1 implements AbstractFactory{public Object createProduct(int type) {Object retObj = null;//type為1表示創建CPU,type為2表示創建主板if(type==1){retObj = new IntelCPU(1156);}else if(type==2){retObj = new GAMainboard(1156);}return retObj;} }public class Schema3 implements AbstractFactory{public Object createProduct(int type) {Object retObj = null;//type為1表示創建CPU,type為2表示創建主板,type為3表示創建內存if(type==1){retObj = new IntelCPU(1156);}else if(type==2){retObj = new GAMainboard(1156);}//創建新添加的產品else if(type==3){retObj = new HyMemory();}return retObj;} }調用處:
public class ComputerEngineer {
private CPUApi cpu= null;//定義組裝機器需要的CPU
private MainboardApi mainboard = null; //定義組裝機器需要的主板
private MemoryApi memory = null; //定義組裝機器需要的內存
//裝機過程
public void makeComputer(AbstractFactory schema){
//1:首先準備好裝機所需要的配件
prepareHardwares(schema);
//2:組裝機器
}
public static void main(String[] args) {
//創建裝機工程師對象
ComputerEngineer engineer = new ComputerEngineer();
//客戶選擇并創建需要使用的裝機方案對象
AbstractFactory schema = new Schema3();
//告訴裝機工程師自己選擇的裝機方案,讓裝機工程師組裝電腦
engineer.makeComputer(schema);
}
3. 總結
比較靈活,但是還是不安全。
優缺點:
優點:切換產品族容易。
缺點:容易造成類層次復雜。比如技嘉主板又分好幾種,難度又要增加幾個類。
總結
以上是生活随笔為你收集整理的《研磨设计模式》chap7 抽象工厂 Abstract Factory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.1 Qt绘图原理
- 下一篇: 6. Qt 信号与信号槽(1)