抽象工廠就是一要一種關聯耦合設計成一個抽象類。抽象工廠模式符合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,支持Intel的CPU:
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只能配Intel的CPU");
}
}
}
主板微星MSIK7N2G,支持AMD的CPU:
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只能配AMD的CPU");
}
}
}
定義抽象電腦工廠類:
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. 你想提供一組對象而不顯示它們的實現過程,只顯示它們的接口。