java設(shè)計(jì)模式【抽象工廠模式】

抽象工廠模式
抽象工廠模式是對(duì)簡(jiǎn)單工廠模式的一個(gè)變種,它允許通過一個(gè)統(tǒng)一的接口來創(chuàng)建不同的產(chǎn)品實(shí)例,而無(wú)需指定具體的子類。在這個(gè)模式中,我們只關(guān)心產(chǎn)品的抽象接口,而將具體的產(chǎn)品實(shí)現(xiàn)留給子類去實(shí)現(xiàn)。這樣,我們可以通過創(chuàng)建不同的工廠對(duì)象來創(chuàng)建不同的產(chǎn)品實(shí)例,而無(wú)需關(guān)心它們實(shí)際實(shí)現(xiàn)的是哪個(gè)具體產(chǎn)品。
抽象工廠模式的實(shí)現(xiàn)分為以下幾個(gè)步驟:
- 定義抽象產(chǎn)品接口:抽象工廠模式的核心是抽象產(chǎn)品接口,它定義了產(chǎn)品的基本結(jié)構(gòu)和行為。
- 定義具體工廠接口:具體工廠接口是實(shí)現(xiàn)抽象產(chǎn)品接口的工廠類,它們負(fù)責(zé)創(chuàng)建具體產(chǎn)品實(shí)例。
- 定義工廠:每個(gè)具體工廠都是一個(gè)特定領(lǐng)域的工廠,它實(shí)現(xiàn)了抽象工廠接口,并提供了具體的產(chǎn)品實(shí)現(xiàn)。
- 創(chuàng)建產(chǎn)品實(shí)例:使用抽象工廠接口,客戶端可以創(chuàng)建不同的產(chǎn)品實(shí)例,而無(wú)需指定具體的子類。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
:
- 具體產(chǎn)品在應(yīng)用層的代碼隔離,無(wú)需關(guān)系創(chuàng)建的細(xì)節(jié)。
- 將一個(gè)系列的產(chǎn)品統(tǒng)一到一起創(chuàng)建,方便產(chǎn)品族的擴(kuò)展。
- 提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),使得客戶端不依賴于具體實(shí)現(xiàn)。
- 通過創(chuàng)建不同的工廠對(duì)象來創(chuàng)建不同的產(chǎn)品實(shí)例,無(wú)需關(guān)心它們實(shí)際實(shí)現(xiàn)的是哪個(gè)具體產(chǎn)品。
缺點(diǎn)
:
- 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴(kuò)展新的產(chǎn)品困難。
- 增加了系統(tǒng)的抽象性和理解難度。
- 使用場(chǎng)景:客戶端(應(yīng)用層)不依賴與產(chǎn)品類的實(shí)現(xiàn)等細(xì)節(jié)。
- 需要大量的重復(fù)代碼,增加了開發(fā)和維護(hù)的成本。
使用場(chǎng)景
- 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
- 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。
- 需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
- 提供一個(gè)產(chǎn)品類庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)。
- 產(chǎn)品之間相互關(guān)聯(lián)、相互依賴且相互約束的地方。
具體實(shí)現(xiàn)
以下以智能產(chǎn)品汽車和手機(jī)為例,繼承關(guān)系如下:
定義抽象工廠
/**
* 智能產(chǎn)品抽象工廠
*/
public interface SmartProductFactory {
ISmartPhone createSmartPhone();
ISmartCar createSmartCar();
}
具體工廠
/**
* @author physicx
* @date 2023/5/17 上午11:18
* @desc 華為工廠
* Created with IntelliJ IDEA
*/
public class HuaweiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new HuaweiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new HuaweiSmartCar();
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:18
* @desc 小米工廠
* Created with IntelliJ IDEA
*/
public class XiaomiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new XiaomiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new XiaomiSmartCar();
}
}
定義抽象產(chǎn)品
/**
* 智能手機(jī)
*/
public interface ISmartPhone {
void printInfo();
}
/**
* 智能汽車
*/
public interface ISmartCar {
void printInfo();
}
具體產(chǎn)品
/**
* @author physicx
* @date 2023/5/17 上午11:19
* @desc 華為智能汽車
* Created with IntelliJ IDEA
*/
public class HuaweiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("華為智能汽車");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 華為智能手機(jī)
* Created with IntelliJ IDEA
*/
public class HuaweiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("華為智能手機(jī)");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能汽車
* Created with IntelliJ IDEA
*/
public class XiaomiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("小米智能汽車");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能手機(jī)
* Created with IntelliJ IDEA
*/
public class XiaomiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("小米智能手機(jī)");
}
}
客戶端調(diào)用
public static void main(String[] args) {
HuaweiFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.createSmartPhone().printInfo();
huaweiFactory.createSmartCar().printInfo();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.createSmartPhone().printInfo();
xiaomiFactory.createSmartCar().printInfo();
}
打印如下:
工廠方法模式和抽象工廠模式區(qū)別
工廠方法模式和抽象工廠模式都是創(chuàng)建型模式,區(qū)別如下:
- 工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)。
- 工廠方法模式的具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例,而抽象工廠模式可以創(chuàng)建多個(gè)。
- 工廠方法模式的使用很簡(jiǎn)單,只要繼承成子類,并實(shí)現(xiàn)工廠方法的工廠就可以了,而抽象工廠模式需要先實(shí)例化它,然后將它傳入一些針對(duì)抽象類型所寫的代碼中。
- 工廠方法模式的優(yōu)點(diǎn)是可以把一群相關(guān)的產(chǎn)品集合起來,而抽象工廠模式的優(yōu)點(diǎn)是可以把一群相關(guān)的產(chǎn)品集合起來,并且創(chuàng)建整個(gè)產(chǎn)品家族的模式。
總之,工廠方法是由子類自行決定實(shí)例化那個(gè)類,而抽象工廠是自己決定實(shí)例化哪個(gè)類。至于是組合還是繼承還是實(shí)現(xiàn)接口都無(wú)所謂。根本區(qū)別在于是自己實(shí)例化還是子類實(shí)例化。
如果產(chǎn)品單一,只有一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)適合使用工廠方法模式。如果存在多個(gè)產(chǎn)品等級(jí),產(chǎn)品分類多個(gè)可以形成產(chǎn)品族合適使用抽象工廠模式。文章來源:http://www.zghlxwxcb.cn/news/detail-447871.html
補(bǔ)充說明
后續(xù)會(huì)依次更新 詳解java 23種設(shè)計(jì)模式,歡迎關(guān)注、交流、補(bǔ)充相關(guān)內(nèi)容(如下)。文章來源地址http://www.zghlxwxcb.cn/news/detail-447871.html
快捷導(dǎo)航 |
---|
設(shè)計(jì)模式簡(jiǎn)介總結(jié) |
單例模式詳解 |
工廠方法模式 |
抽象工廠模式 |
到了這里,關(guān)于java設(shè)計(jì)模式【抽象工廠模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!