本文爲原創文章,轉載需註明出處!
抽象工廠模式與工廠方法模式有相似的概念。抽象工廠模式和工廠模式一樣是層次類的結構,但是在這裏它不僅僅負責創建一個產品類的對象,而是創建一族產品類對象。在Java程序中,它可以是接口或者抽象類。
抽象工廠模式中包括:
(1)一系列互相有關聯的產品類,這些產品類有相同的結構。
(2)一系列實的工廠類,實現由抽象工廠類提供的接口。每個實的工廠類生產一組相關的產品類的對象。
下面將以不同保險公司和不同的險種所組成的抽象工廠向大家描述這一體系結構
類圖:
類圖是用Visio畫的,看起來可能會比較複雜,那就直接看代碼吧。
1、首先我們需要創建一個工廠類接口:
public abstract class InsuranceFactory {
public static final String BodyInjur = "駕駛員身體受傷險";
public static final String Collisoin = "汽車損壞險";
public static final String ManyAccidents = "多種事故險";
public static final String PersonInjur = "人員傷亡險";
public abstract PICC getPICC(); //分別定義兩種公司,即工廠類
public abstract PingAn getPingAn();
public static InsuranceFactory getInsuranceFactory(String type) {
InsuranceFactory If = null;
if (type.equals(InsuranceFactory.BodyInjur)) { //根據客戶選擇保險類型的不同創建
If = new BodyInjurFactory(); //不同類型的“保險工廠”
}
else if (type.equals(InsuranceFactory.Collisoin)) {
If = new CollisionFactory();
}else if (type.equals(InsuranceFactory.ManyAccidents)) {
If = new ManyAccidentsFactory();
}
else if (type.equals(InsuranceFactory.PersonInjur)) {
If = new PersonInjurFactory();
}
return If;
}
}
2、根據工廠類接口繼承的子類(只舉其中一例)
public class BodyInjurFactory extends InsuranceFactory { //分別獲取PICC和PingAn的駕駛員
//身體受傷信息
public PICC getPICC() {
return new PICCBodyInjur();
}
public PingAn getPingAn() {
return new PingAnBodyInjur();
}
}
3、保險公司接口
public interface PICC {
public String getPICCInfo(); //獲取PICC保險詳細信息
}
4、實現該接口的子類
public class PICCBodyInjur implements PICC{
public String getPICCInfo() { //PICC的駕駛員身體受傷保險描述
return "中國人壽保險駕駛員身體受傷保險!";
}
}
抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。
抽象工廠模式的優勢在於:當客戶對象要從一個相關的產品組中創建一個對象,而沒有必要知道到底創建哪個對象時,可以應用抽象工廠模式。如果不使用抽象工廠模式,創建對象的條件語句將會出現在客戶程序的許多地方,程序的可維護性將變差。抽象工廠模式幫助程序員避免了以上所述的重複的、複雜的條件語句,提供了必要的創建對象的接口。而且最關鍵的一點就是抽象工廠模式符合了軟件體系結構最基本的開閉原則。