Abstract Factory Pattern(抽象工廠模式)——莫勇鵬老師

Abstract Factory Pattern(抽象工廠模式)

抽象工廠就是一要一種關聯耦合設計成一個抽象類。抽象工廠模式符合GRASP的純虛構模式,同時取得高內聚低耦合的效果。git

 

UML類圖以下:ide

其中的類或對象之間的關係爲:this

AbstractFactory(抽象工廠):聲明生成抽象產品的方法。spa

ConcreteFactory(具體工廠):執行生成抽象產品的方法,生成一個具體的產品。設計

AbstractProduct(抽象產品):爲一種產品聲明接口。對象

Product(具體產品):定義具體工廠生成的具體產品的對象,實現產品接口。接口

Client(客戶):咱們的應用程序,使用抽象產品和抽象工廠生成對象。ci

 

Java實例——電腦產品get

 

首先,定義CPU接口:產品

public interface CPU {

       public String getCPU();

}

 

定義AMD類,實現CPU接口:

public class AMD implements CPU{

 

       @Override

       public String getCPU() {

              // TODO Auto-generated method stub

              return "Athlon XP 2800+";

       }

 

}

 

定義Intel類,實現CPU接口:

public class Intel implements CPU{

 

       @Override

       public String getCPU() {

              // TODO Auto-generated method stub

              return "奔騰4 3.2C";

       }

 

}

 

定義硬盤接口:

public interface HardDisk {

       public String getSize();

}

 

定義Maxtor類,實現硬盤接口:

public class Maxtor implements HardDisk{

 

       @Override

       public String getSize() {

              // TODO Auto-generated method stub

              return "MaxLine Plus II 200G";

       }

 

}

 

定義WestDigit類,實現硬盤接口:

public class WestDigit implements HardDisk{

 

       @Override

       public String getSize() {

              // TODO Auto-generated method stub

              return "WD2500JD 250G";

       }

 

}

 

定義主板的接口,包含參數爲CPU的公共方法Attach()

public interface MainBoard {

       public void Attach(CPU cpu) throws Exception;

}

 

主板微星MSI865PE,支持IntelCPU

public class MSI865PE implements MainBoard{

 

       @Override

       public void Attach(CPU cpu) throws Exception {

              // TODO Auto-generated method stub

              if(cpu.getClass().toString().endsWith("Intel")){

                     System.out.println("MSI865PE");

              }

              else {

                     throw new Exception("主板MSI865PE只能配IntelCPU");

              }

       }

 

}

 

主板微星MSIK7N2G,支持AMDCPU

public class MSIK7N2G implements MainBoard{

 

       @Override

       public void Attach(CPU cpu) throws Exception {

              // TODO Auto-generated method stub

              if(cpu.getClass().toString().endsWith("AMD")){

                     System.out.println("MSIK7N2G");

              }

              else {

                     throw new Exception("主板MSIK7N2G只能配AMDCPU");

              }

       }

 

}

 

定義抽象電腦工廠類:

Public abstract class ComputerFactory {

       CPU cpu;

       HardDisk hd;

       MainBoard mb;

      

       public void show(){

              try {

                     System.out.println(this.getClass().getName().toString()+"生產的電腦配置");

                     System.out.println("CPU:"+cpu.getCPU());

                     System.out.println("HardDisk:"+hd.getSize());

                     System.out.print("MainBoard:");

                     mb.Attach(cpu);

              } catch (Exception e) {

                     // TODO: handle exception

                     System.out.println(e.getMessage());

              }

       }

}

 

抽象電腦工廠類派生類IBM,定義其返回的系列配件產品:

public class IBM extends ComputerFactory{

       IBM()

       {

              cpu=new Intel();

              hd=new WestDigit();

              mb=new MSI865PE();

       }

}

 

抽象電腦工廠類派生類Dell,定義其返回的系列配件產品:

public class Dell extends ComputerFactory{

       Dell() {

              // TODO Auto-generated constructor stub

              cpu=new AMD();

              hd=new Maxtor();

              mb=new MSIK7N2G();

       }

}

 

客戶程序調用:

public class Client {

       public static void main(String[] args){

              IBM ibm=new IBM();

              ibm.show();

              Dell dell=new Dell();

              dell.show();

       }

}

 

輸出結果爲:

abstract_factory_pattern.IBM生產的電腦配置

CPU:奔騰4 3.2C

HardDisk:WD2500JD 250G

MainBoard:MSI865PE

abstract_factory_pattern.Dell生產的電腦配置

CPU:Athlon XP 2800+

HardDisk:MaxLine Plus II 200G

MainBoard:MSIK7N2G

 

應用情景:

1.      系統須要屏蔽有關對象如何建立、如何組織和如何表示。

2.      系統須要由關聯的多個對象來構成。

3.      有關聯的多個對象須要一塊兒應用而且它們的約束是強迫的(不可分離)。

4.      你想提供一組對象而不顯示它們的實現過程,只顯示它們的接口。

相關文章
相關標籤/搜索