Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
抽象工廠模式
概述
抽象工廠模式(Abastract Factory Pattern)屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
它提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,無(wú)須顯式指定他們具體的類(lèi)。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
抽象工廠模式是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠,該超級(jí)工廠又稱(chēng)為其他工廠的工廠。

產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族
抽象工廠模式是工廠方法模式的加強(qiáng)版。工廠方法模式針對(duì)一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),而抽象工廠模式面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),一個(gè)工廠角色可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建 。
產(chǎn)品等級(jí)結(jié)構(gòu)
產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個(gè)車(chē)輛抽象類(lèi),其子類(lèi)有BM汽車(chē)、AD汽車(chē)等,則抽象車(chē)輛與具體品牌的車(chē)輛之間形成了一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),抽象車(chē)輛類(lèi)是父類(lèi),而具體品牌的工廠類(lèi)是子類(lèi)。
產(chǎn)品族
產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品,如BM工廠生成的BM車(chē)輪、BM車(chē)架等組成一個(gè)產(chǎn)品族。這幾個(gè)產(chǎn)品屬于不同的產(chǎn)品等級(jí)結(jié)構(gòu),但由同一個(gè)工廠創(chuàng)建。
一系列相關(guān)產(chǎn)品, 如椅子 、 沙發(fā)和咖啡桌
系列產(chǎn)品的不同變體。 如現(xiàn)代、 ? 維多利亞 、 ? 裝飾風(fēng)藝術(shù)等風(fēng)格生成椅子、沙發(fā)和咖啡桌

優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶(hù)端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象。
缺點(diǎn):
產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼
主要角色
1.抽象產(chǎn)品角色(AbstractProduct)
它是工廠方法模式所創(chuàng)建的對(duì)象的父類(lèi),或它們共同擁有的接口。
2.具體產(chǎn)品角色(ConcreteProduct)
抽象工廠模式所創(chuàng)建的任何產(chǎn)品對(duì)象都是某一個(gè)具體產(chǎn)品類(lèi)的實(shí)例。
3.抽象工廠角色(AbstractFactory)
它是工廠方法模式的核心,它與應(yīng)用程序無(wú)關(guān)。
4.具體工廠角色(ConcreteFactory)
它直接在客戶(hù)端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。

抽象工廠模式的基本使用
創(chuàng)建抽象產(chǎn)品
創(chuàng)建抽象產(chǎn)品角色,工廠類(lèi)所創(chuàng)建的產(chǎn)品的父類(lèi),封裝了產(chǎn)品對(duì)象的公共方法
public interface IWheel {
void create(String name);
}
public interface IFrame {
void create(String name);
}
創(chuàng)建具體產(chǎn)品
創(chuàng)建一系列相關(guān)的產(chǎn)品對(duì)象,如創(chuàng)建BMCar產(chǎn)品族,擴(kuò)展一系列相關(guān)產(chǎn)品對(duì)象。
public class CarWheel implements IWheel{
@Override
public void create(String name) {
System.out.println("制造"+name+"車(chē)輪");
}
}
public class CarFrame implements IFrame {
@Override
public void create(String name) {
System.out.println("制造"+name+"車(chē)架");
}
}創(chuàng)建抽象工廠
創(chuàng)建抽象工廠,提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口
public abstract class CarFactory {
/**
* 制造車(chē)輪產(chǎn)品
*/
protected abstract IWheel createWheel();
/**
* 制造車(chē)架產(chǎn)品
*/
protected abstract IFrame createFrame();
}
創(chuàng)建具體工廠
創(chuàng)建具體產(chǎn)品工廠,提供一個(gè)產(chǎn)品類(lèi)的庫(kù)
public class BMCarFactory extends CarFactory {
@Override
protected IWheel createWheel() {
return new CarWheel();
}
@Override
protected IFrame createFrame() {
return new CarFrame();
}
}
public class ADCarFactory extends CarFactory {
@Override
protected IWheel createWheel() {
return new CarWheel();
}
@Override
protected IFrame createFrame() {
return new CarFrame();
}
}客戶(hù)端執(zhí)行
public static void main(String[] args) {
BMCarFactory bmCarFactory = new BMCarFactory();
bmCarFactory.createFrame().create("BM");
bmCarFactory.createWheel().create("BM");
ADCarFactory adCarFactory = new ADCarFactory();
adCarFactory.createFrame().create("AD");
adCarFactory.createWheel().create("AD");
}
制造BM車(chē)架
制造BM車(chē)輪
制造AD車(chē)架
制造AD車(chē)輪
到此這篇關(guān)于Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式(Abstract Factory)的文章就介紹到這了,更多相關(guān)Java抽象工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置連接兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
本文主要介紹了SpringBoot配置連接兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java實(shí)現(xiàn)學(xué)生教師管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生教師管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Springboot中@ConfigurationProperties輕松管理應(yīng)用程序的配置信息詳解
通過(guò)@ConfigurationProperties注解,可以將外部配置文件中的屬性值注入到JavaBean中,簡(jiǎn)化了配置屬性的讀取和管理,這使得SpringBoot應(yīng)用程序中配置文件的屬性值可以映射到POJO類(lèi)中,實(shí)現(xiàn)類(lèi)型安全的屬性訪問(wèn),此方法避免了手動(dòng)讀取配置文件屬性的需要2024-10-10
Java CharacterEncodingFilter案例詳解
這篇文章主要介紹了Java CharacterEncodingFilter案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
InteliJ IDEA 設(shè)置eclipse快捷鍵 的圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了InteliJ IDEA 設(shè)置eclipse快捷鍵 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下2018-06-06
springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案
這篇文章主要給大家介紹了關(guān)于Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案,這個(gè)異常是java.net包中的一部分,具體說(shuō)它是類(lèi)的一個(gè)實(shí)例,異常通常是由主機(jī)名無(wú)法解析為IP地址引起的,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
SpringBoot實(shí)現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
動(dòng)態(tài)代理模擬實(shí)現(xiàn)aop的示例
下面小編就為大家?guī)?lái)一篇?jiǎng)討B(tài)代理模擬實(shí)現(xiàn)aop的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望對(duì)大家有所幫助2017-11-11

