Java創(chuàng)建型設計模式之抽象工廠模式(Abstract?Factory)
抽象工廠模式
概述
抽象工廠模式(Abastract Factory Pattern)屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
它提供一個創(chuàng)建一系列相關或相互依賴對象的接口,無須顯式指定他們具體的類。每個生成的工廠都能按照工廠模式提供對象。
抽象工廠模式是圍繞一個超級工廠創(chuàng)建其他工廠,該超級工廠又稱為其他工廠的工廠。
產(chǎn)品等級結(jié)構(gòu)與產(chǎn)品族
抽象工廠模式是工廠方法模式的加強版。工廠方法模式針對一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式面對多個產(chǎn)品等級結(jié)構(gòu),一個工廠角色可以負責多個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 。
產(chǎn)品等級結(jié)構(gòu)
產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個車輛抽象類,其子類有BM汽車、AD汽車等,則抽象車輛與具體品牌的車輛之間形成了一個產(chǎn)品等級結(jié)構(gòu),抽象車輛類是父類,而具體品牌的工廠類是子類。
產(chǎn)品族
產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如BM工廠生成的BM車輪、BM車架等組成一個產(chǎn)品族。這幾個產(chǎn)品屬于不同的產(chǎn)品等級結(jié)構(gòu),但由同一個工廠創(chuàng)建。
一系列相關產(chǎn)品, 如椅子 、 沙發(fā)和咖啡桌
系列產(chǎn)品的不同變體。 如現(xiàn)代、 ? 維多利亞 、 ? 裝飾風藝術(shù)等風格生成椅子、沙發(fā)和咖啡桌
優(yōu)缺點
優(yōu)點:
當一個產(chǎn)品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產(chǎn)品族中的對象。
缺點:
產(chǎn)品族擴展非常困難,要增加一個系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼
主要角色
1.抽象產(chǎn)品角色(AbstractProduct)
它是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。
2.具體產(chǎn)品角色(ConcreteProduct)
抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個具體產(chǎn)品類的實例。
3.抽象工廠角色(AbstractFactory)
它是工廠方法模式的核心,它與應用程序無關。
4.具體工廠角色(ConcreteFactory)
它直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實例。
抽象工廠模式的基本使用
創(chuàng)建抽象產(chǎn)品
創(chuàng)建抽象產(chǎn)品角色,工廠類所創(chuàng)建的產(chǎn)品的父類,封裝了產(chǎn)品對象的公共方法
public interface IWheel { void create(String name); } public interface IFrame { void create(String name); }
創(chuàng)建具體產(chǎn)品
創(chuàng)建一系列相關的產(chǎn)品對象,如創(chuàng)建BMCar產(chǎn)品族,擴展一系列相關產(chǎn)品對象。
public class CarWheel implements IWheel{ @Override public void create(String name) { System.out.println("制造"+name+"車輪"); } } public class CarFrame implements IFrame { @Override public void create(String name) { System.out.println("制造"+name+"車架"); } }
創(chuàng)建抽象工廠
創(chuàng)建抽象工廠,提供一個創(chuàng)建一系列相關或相互依賴對象的接口
public abstract class CarFactory { /** * 制造車輪產(chǎn)品 */ protected abstract IWheel createWheel(); /** * 制造車架產(chǎn)品 */ protected abstract IFrame createFrame(); }
創(chuàng)建具體工廠
創(chuàng)建具體產(chǎn)品工廠,提供一個產(chǎn)品類的庫
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(); } }
客戶端執(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車架
制造BM車輪
制造AD車架
制造AD車輪
到此這篇關于Java創(chuàng)建型設計模式之抽象工廠模式(Abstract Factory)的文章就介紹到這了,更多相關Java抽象工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu))
這篇文章主要介紹了優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價值,需要的朋友可以參考下2018-01-01Java ArrayList 數(shù)組之間相互轉(zhuǎn)換
本文通過代碼示例給大家講解arraylist轉(zhuǎn)化為數(shù)組,然后數(shù)組轉(zhuǎn)化為arraylist的相關資料,感興趣的朋友一起看看吧2015-11-11@JsonProperty和@JSONField注解的區(qū)別解析(最新)
Jackson是一款優(yōu)秀的JSON解析庫,添加了依賴之后就可以使用對應的注解,讓我們能夠自由的將Java對象和JSON做轉(zhuǎn)換,這篇文章主要介紹了@JsonProperty和@JSONField注解的區(qū)別,需要的朋友可以參考下2024-04-04