前言:
為什么之前寫過Golang 版的設(shè)計模式,還在重新寫Java
版?
答:因為對于我而言,當(dāng)然也希望對正在學(xué)習(xí)的大伙有幫助。Java作為一門純面向?qū)ο蟮恼Z言,更適合用于學(xué)習(xí)設(shè)計模式。
為什么類圖要附上uml
因為很多人學(xué)習(xí)有做筆記的習(xí)慣,如果單純的只是放一張圖片,那么學(xué)習(xí)者也只能復(fù)制一張圖片,可復(fù)用性較低,附上uml,方便有新理解時,快速出新圖。
??[設(shè)計模式Java實現(xiàn)附plantuml源碼]專鏈
- 確保對象的唯一性~單例模式
- 集中式工廠的實現(xiàn)~簡單工廠模式
- 多態(tài)工廠的實現(xiàn)——工廠方法模式
- 產(chǎn)品族的創(chuàng)建——抽象工廠模式
- 對象的克隆~原型模式
- 復(fù)雜對象的組裝與創(chuàng)建——建造者模式
工廠方法模式通過引入工廠等級結(jié)構(gòu),解決了簡單工廠模式中工廠類職責(zé)太重的問題。但由于工廠方法模式中的每個工廠只生產(chǎn)一類產(chǎn)品,可能會導(dǎo)致系統(tǒng)中存在大量的工廠類,勢必會增加系統(tǒng)的開銷。此時,可以考慮將一些相關(guān)的產(chǎn)品組成一個“產(chǎn)品族”,由同一個工廠來統(tǒng)一生產(chǎn),這就是本章將要學(xué)習(xí)的抽象工廠模式的基本思想。
為了更好地理解抽象工廠模式,這里先引入如下兩個概念:
(1)產(chǎn)品等級結(jié)構(gòu)。產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),例如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象電視機是父類,而具體品牌的電視機是其子類。
(2)產(chǎn)品族。在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品。例如海爾電器工廠生產(chǎn)的海爾電視機、海爾電冰箱,海爾電視機位于電視機產(chǎn)品等級結(jié)構(gòu)中,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中,海爾電視機、海爾電冰箱構(gòu)成了一個產(chǎn)品族。
抽象工廠模式為創(chuàng)建一組對象提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是創(chuàng)建一種產(chǎn)品,它負責(zé)創(chuàng)建一族產(chǎn)品。
抽象工廠模式定義如下:抽象工廠模式(Abstract Factory Pattern
):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,它是一種對象創(chuàng)建型模式。
@startuml
abstract class 抽象產(chǎn)品族1海爾{}
class 產(chǎn)品1電視機 extends 抽象產(chǎn)品族1海爾 {}
class 產(chǎn)品2洗衣機 extends 抽象產(chǎn)品族1海爾 {}
abstract class 抽象產(chǎn)品族2{}
abstract class 抽象工廠 {
+ 生產(chǎn)抽象產(chǎn)品族1():抽象產(chǎn)品族1海爾
+ 生產(chǎn)抽象產(chǎn)品族2():抽象產(chǎn)品族2
}
class 具體工廠1 extends 抽象產(chǎn)品族1海爾 implements 抽象工廠 {
+ 生產(chǎn)產(chǎn)品1():抽象產(chǎn)品族1海爾
+ 生產(chǎn)產(chǎn)品2():抽象產(chǎn)品族1海爾
}
具體工廠1 -up-> 產(chǎn)品1電視機
具體工廠1 -up-> 產(chǎn)品2洗衣機
@enduml
在抽象工廠模式結(jié)構(gòu)圖中包含以下4個角色。
(1)AbstractFactory
(抽象工廠):它聲明了一組用于創(chuàng)建一族產(chǎn)品的方法,每個方法對應(yīng)一種產(chǎn)品。
(2)ConcreteFactory
(具體工廠):它實現(xiàn)了在抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個產(chǎn)品族,每種產(chǎn)品都位于某個產(chǎn)品等級結(jié)構(gòu)中。
(3)AbstractProduct
(抽象產(chǎn)品):它為每種產(chǎn)品聲明接口,在抽象產(chǎn)品中聲明了產(chǎn)品所具有的業(yè)務(wù)方法。
(4)ConcreteProduct
(具體產(chǎn)品):它定義具體工廠生產(chǎn)的具體產(chǎn)品對象,實現(xiàn)在抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法。
代碼實現(xiàn)
public class AbstractFactoryDemo {
// 抽象產(chǎn)品族1
static abstract class AbstractProductFamily1 {}
// 產(chǎn)品1
static class Product1 extends AbstractProductFamily1 {}
// 產(chǎn)品2
static class Product2 extends AbstractProductFamily1 {}
// 抽象產(chǎn)品族2
static abstract class AbstractProductFamily2 {}
// 抽象工廠
interface AbstractFactory {
AbstractProductFamily1 createProductFamily1();
AbstractProductFamily2 createProductFamily2();
}
// 具體工廠1
static class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductFamily1 createProductFamily1() {
return new Product1();
}
@Override
public AbstractProductFamily2 createProductFamily2() {
// 在具體工廠1中創(chuàng)建抽象產(chǎn)品族2的實例
return null; // 根據(jù)具體情況進行實現(xiàn)
}
}
public static void main(String[] args) {
// 創(chuàng)建具體工廠1的實例
AbstractFactory factory = new ConcreteFactory1();
// 使用具體工廠1創(chuàng)建抽象產(chǎn)品族1的實例
AbstractProductFamily1 product1 = factory.createProductFamily1();
AbstractProductFamily1 product2 = factory.createProductFamily1();
System.out.println(product1);
System.out.println(product2);
// 使用具體工廠1創(chuàng)建抽象產(chǎn)品族2的實例
AbstractProductFamily2 product3 = factory.createProductFamily2();
System.out.println(product3);
}
}
抽象工廠總結(jié)
抽象工廠模式的主要優(yōu)點如下:
(1)抽象工廠模式隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔離,更換一個具體工廠就變得相對容易,所有的具體工廠都實現(xiàn)了在抽象工廠中聲明的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統(tǒng)的行為。
(2)當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象。
(3)增加新的產(chǎn)品族很方便,無須修改已有系統(tǒng),符合開閉原則。
抽象工廠模式的主要缺點是:
增加新的產(chǎn)品等級結(jié)構(gòu)麻煩,需要對原有系統(tǒng)進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了開閉原則。文章來源:http://www.zghlxwxcb.cn/news/detail-814101.html
適用場景
在以下情況下可以考慮使用抽象工廠模式:
(1)一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實例如何被創(chuàng)建、組合和表達的細節(jié),這對于所有類型的工廠模式都是很重要的,用戶無須關(guān)心對象的創(chuàng)建過程,將對象的創(chuàng)建和使用解耦。
(2)系統(tǒng)中有多于一個的產(chǎn)品族,而每次只使用其中某一個產(chǎn)品族。可以通過配置文件等方式來使得用戶可以動態(tài)改變產(chǎn)品族,也可以很方便地增加新的產(chǎn)品族。
(3)屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來。同一個產(chǎn)品族中的產(chǎn)品可以是沒有任何關(guān)系的對象,但是它們都具有一些共同的約束。例如同一操作系統(tǒng)下的按鈕和文本框,按鈕與文本框之間沒有直接關(guān)系,但它們都是屬于某一操作系統(tǒng)的,此時具有一個共同的約束條件:操作系統(tǒng)的類 型。
(4)產(chǎn)品等級結(jié)構(gòu)穩(wěn)定,設(shè)計完成之后,不會向系統(tǒng)中增加新的產(chǎn)品等級結(jié)構(gòu)或者刪除已有的產(chǎn)品等級結(jié)構(gòu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-814101.html
到了這里,關(guān)于[設(shè)計模式Java實現(xiàn)附plantuml源碼~創(chuàng)建型] 產(chǎn)品族的創(chuàng)建——抽象工廠模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!