定義:
提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類結構:
抽象工廠模式中的角色和工廠方法模式的完全相同,由四個部分組成:場景例項:組裝電腦,選擇組裝電腦的配件
客戶選擇不同的cpu和主機板,在最終確定裝機方案之前,還需整體考慮各個配件之間的相容性。比如cpu針腳數和主機板提供的cpu插口不相容,是無法組裝的。也就是說,裝機方案是有整體性的,裡面選擇的各個配件之間是有關聯的簡單起見,使用簡單工廠實現:
/**
* cpu介面《產品簇1>
*/public inte***ce cpuapi
/** * 主機板介面《產品簇2>
*/public inte***ce mainboardapi
class intelcpu implements cpuapi
@override
public void calculate()
}class amdcpu implements cpuapi
@override
public void calculate()
}/**
* intel主機板
*/class intelmainboard implements mainboardapi
@override
public void installcpu()
}/**
* amd主機板
*/class amdmainboard implements mainboardapi
@override
public void installcpu()
}
/**
* cpu工廠
*/public class cpufactory else
return cpu; }}
/** * 主機板工廠
*/class mainboardfactory else
return mainboard;
}}
/**
* 裝機工程師,不知道具體實現,只根據客戶要求組裝電腦
*/class computerengineer
}
public class client
}
有何問題?
上面的實現雖然通過簡單工廠解決了,但有乙個問題沒解決,那就是這些cpu物件和主機板物件是有關係的,是需要互相匹配的。而上面的實現並沒有維護這種關聯關係,如客戶端測試傳入1,2引數就會導致無法組裝。抽象工廠模式來解決問題
/**
* 抽象工廠:宣告建立抽象產品物件的操作
*@author: april
*@date: 2014-7-5
*/public inte***ce abstractfactory
/**
* 裝機方案一:intel的cpu與intel主機板
*/public class schema1 implements abstractfactory
@override
public mainboardapi createmainboardapi()
}/**
* 裝機方案二:amd的cpu與amd的主機板
*/class schema2 implements abstractfactory
@override
public mainboardapi createmainboardapi()
}
/**
* 裝機工程師,不知道具體實現,只根據客戶要求組裝電腦
*/class computerengineer
}
定義可擴充套件的工廠public class client
}
相對靈活但不太安全的改進方式:在抽象工廠中不需定義那麼多方法,只定義乙個方法,給這個方法設定乙個引數,通過這個引數判斷具體建立什麼產品簇物件;這個方法的返回值就不能是具體某個產品型別了,可以是所有產品簇都實現的介面,也可以直接用object型別理解抽象工廠模式//抽象工廠修改
public inte***ce abstractfactory
//裝機方案修改
public class schema1 implements abstractfactoryelse if (type==2)
return result; }}
//裝機工程師修改
public class computerengineer
}
此時,如果要加入乙個新的產品-記憶體,當然可以提供乙個新的裝機方案來使用它,這樣已有的**就不需要變化了
為一系列相關物件或相互依賴的物件建立乙個介面。注意:介面內的方法不是任意堆砌的,而是一系列相關或相互依賴的方法,比如上面的cpu與主機板,就是為組裝一台電腦的相關物件
abstractfactory定義的建立產品的方法可以看成是工廠方法,而這些工廠方法的具體實現就延遲到了具體的工廠裡面。也就是說使用工廠方法來實現抽象工廠
抽象工廠定義的是乙個產品簇,這帶來很大的靈活性,切換產品簇的時候,只需提供不同的抽象工廠實現就可以了,也就是說現在是以產品簇作為乙個整體被切換優點:
缺點:
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
抽象工廠模式 常用設計模式 抽象工廠模式
提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。在工廠方法模式中,我們的具體建立者每次使用都只能建立乙個同型別的物件,假如我們現在需要的是多個不同型別的物件,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法組合到乙個類,這就是抽象工廠模式,它就是專門用來建立多個產品,也可以說...
抽象工廠模式 設計模式(九) 抽象工廠模式
提供乙個為建立一組相關或相互依賴物件的介面,且無須指定它們的具體類。它屬於建立型模式。在抽象工廠模式中,每個具體工廠都提供了多個用於建立多種不同型別具體物件的方法,這些不同型別的物件都存在乙個共同的屬性,構成乙個族。上篇文章設計模式 八 工廠方法模式說到工廠方法模式中只考慮某一類產品的生產,例如可樂...