設計模式 抽象工廠模式ing

2021-06-22 14:33:55 字數 3327 閱讀 8084

定義:

提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類

結構:

抽象工廠模式中的角色和工廠方法模式的完全相同,由四個部分組成:

場景例項:組裝電腦,選擇組裝電腦的配件

客戶選擇不同的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 使用,建立...

抽象工廠模式 常用設計模式 抽象工廠模式

提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。在工廠方法模式中,我們的具體建立者每次使用都只能建立乙個同型別的物件,假如我們現在需要的是多個不同型別的物件,工廠方法就滿足不了需求了。這時我們可以把多個工廠方法組合到乙個類,這就是抽象工廠模式,它就是專門用來建立多個產品,也可以說...

抽象工廠模式 設計模式(九) 抽象工廠模式

提供乙個為建立一組相關或相互依賴物件的介面,且無須指定它們的具體類。它屬於建立型模式。在抽象工廠模式中,每個具體工廠都提供了多個用於建立多種不同型別具體物件的方法,這些不同型別的物件都存在乙個共同的屬性,構成乙個族。上篇文章設計模式 八 工廠方法模式說到工廠方法模式中只考慮某一類產品的生產,例如可樂...