Java中什么是抽象工厂
這篇文章將為大家詳細講解有關Java中什么是抽象工廠,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
抽象工廠模式
1、什么是抽象工廠
在現實生活中許多工廠是綜合型的工廠,能生產多種類)的產品,就拿案例里面的可樂來說,在節日的時候可能會有圣誕版的可樂,也可能有新年版的可樂(如果不存在就假設),這篇文章要介紹的抽象工廠模式將考慮多等級產品的生產,將同一個具體工廠所生產的位于不同等級的一組產品稱為一個產品族。
比如:
抽象工廠模式的定義:
是一種為訪問類提供一個創建一組相關或相互依賴對象的接口,且訪問類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。
抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品。
2、抽象工廠模式的優缺點
使用抽象工廠模式一般要滿足以下條件:
-
系統中有多個產品族,每個具體工廠創建同一族但屬于不同等級結構的產品
-
系統一次只可能消費其中某一族產品,即同族的產品一起使用
優點:
-
可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理
-
當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組
-
抽象工廠增強了程序的可擴展性,當增加一個新的產品族時,不需要修改原代碼,滿足開閉原則
缺點:
當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度
3、抽象工廠模式的結構與實現
抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產品和具體產品等 4 個要素構成,但抽象工廠中方法個數不同,抽象產品的個數也不同?,F在我們來分析其基本結構和實現方法
模式的結構:
-
抽象工廠:提供了創建產品的接口,它包含多個創建產品的方法 newProduct(),可以創建多個不同等級的產品
-
具體工廠:主要是實現抽象工廠中的多個抽象方法,完成具體產品的創建
-
抽象產品:定義了產品的規范,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品
-
具體產品:實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間是多對一的關系
4、抽象工廠方法模式代碼實現
這里還是以上面兩篇文章的可樂工廠進行擴展,將按照以下的結構圖來設計和實現:
抽象可樂工廠結構圖(自繪):
可口可樂接口:
publicinterfaceCocaCola{
publicvoidCocaCola();
}
百事可樂接口:
publicinterfacePepsiCola{
publicvoidPepsiCola();
}
圣誕版可口可樂:
/**
*生產圣誕版可口可樂的方法
*/
publicclassChristmasCocaColaimplementsCocaCola{
@Override
publicvoidCocaCola(){
System.out.println("生產了圣誕版的可口可樂");
}
}
新年版可口可樂:
/**
*生產新年版的可口可樂
*/
publicclassNewYearCocaColaimplementsCocaCola{
@Override
publicvoidCocaCola(){
System.out.println("生產了新年版的可口可樂");
}
}
圣誕版百事可樂:
/**
*生產圣誕版百事可樂方法
*/
publicclassChristmasPepsiColaimplementsPepsiCola{
@Override
publicvoidPepsiCola(){
System.out.println("生產了圣誕版的百事可樂");
}
}
新年版百事可樂:
/**
*生產新年版百事可樂的方法
*/
publicclassNewYearPepsiColaimplementsPepsiCola{
@Override
publicvoidPepsiCola(){
System.out.println("生產了新年版的百事可樂");
}
}
可樂工廠(抽象工廠):
/**
*可樂工廠(抽象工廠)
*可以生產兩種版本的可樂
*/
publicinterfaceColaFactory{
//生產可口可樂:兩個版本
publicCocaColagetCocaCola();
//生產百事可樂:兩個版本
publicPepsiColagetPepsi();
}
圣誕版系列可樂工廠:
/**
*圣誕系列加工廠
*生產圣誕的百事可樂和可口可樂
*/
publicclassChristmasFactoryimplementsColaFactory{
@Override
publicCocaColagetCocaCola(){
returnnewChristmasCocaCola();
}
@Override
publicPepsiColagetPepsi(){
returnnewChristmasPepsiCola();
}
}
新年版系列可樂工廠:
/**
*新年版的加工廠
*可以生產新年版的可口可樂和百事可樂
*/
publicclassNewYearFactoryimplementsColaFactory{
@Override
publicCocaColagetCocaCola(){
returnnewNewYearCocaCola();
}
@Override
publicPepsiColagetPepsi(){
returnnewNewYearPepsiCola();
}
}
客戶端(測試類):
publicclassTest{
publicstaticvoidmain(String[]args){
//生產圣誕版可口可樂:
ColaFactoryfactory=newChristmasFactory();
CocaColacola=factory.getCocaCola();
cola.CocaCola();
//生產圣誕版百事可樂:
ColaFactoryfactory1=newChristmasFactory();
PepsiColapepsiCola=factory1.getPepsi();
pepsiCola.PepsiCola();
//生產新年版的可口可樂:
ColaFactoryfactory2=newNewYearFactory();
CocaColacola1=factory2.getCocaCola();
cola1.CocaCola();
//生產新年版的百事可樂:
ColaFactoryfactory3=newNewYearFactory();
PepsiColapepsiCola1=factory3.getPepsi();
pepsiCola1.PepsiCola();
}
}
輸出結果:
生產了圣誕版的可口可樂
生產了圣誕版的百事可樂
生產了新年版的可口可樂
生產了新年版的百事可樂
這就是抽象工廠方法模式的可樂工廠,并且同一個具體工廠所生產的位于不同等級的一組產品稱為一個產品族。
5、抽象工廠模式的應用場景
-
當需要創建的對象是一系列相互關聯或相互依賴的產品族時,比如飲料工廠內的多款飲料
-
系統中有多個產品族,但每次只使用其中的某一族產品。比如一個只喝圣誕版的可口可樂和新年版的百事可樂
-
系統中提供了產品的類庫,且所有產品的接口相同,客戶端不依賴產品實例的創建細節和內部結構。
6、抽象工廠模式的擴展
-
當增加一個新的產品族時只需增加一個新的具體工廠,不需要修改原代碼,滿足開閉原則
-
當產品族中需要增加一個新種類的產品時,則所有的工廠類都需要進行修改,不滿足開閉原則
注意: 當系統中只存在一個等級結構的產品時,抽象工廠模式將退化到工廠方法模式
最后:一張圖看懂簡單工廠模式、工廠方法模式、抽象工廠模式:
總結
以上是生活随笔為你收集整理的Java中什么是抽象工厂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL a库备份恢复为B库_MySQ
- 下一篇: java 中map_Java Map集合