摘要:抽象工廠模式提供了創(chuàng)建一系列相互依賴對象的接口,無需指定具體類抽象工廠模式是圍繞著一個超級工廠工作,創(chuàng)造其它的工廠類,也被稱為工廠的工廠,這種類型的設計模式是創(chuàng)造性的模式,因為這種模式提供了創(chuàng)建對象的最佳方法之一。
概述工廠模式是JAVA中最常用的設計模式之一,使用工廠模式后,創(chuàng)建對象的時候不在將創(chuàng)建邏輯暴露給客戶端,而是通過實現(xiàn)接口的方式創(chuàng)建對象,這種設計模式也是對象實例化的最佳方式。
工廠模式的三種形態(tài)
簡單工廠(Simple Factory)
工廠方法(Factory Method)
抽象工廠(Abstract Factory)
簡單工廠簡單工廠模式屬于工廠模式的小弟,未被收納進GOF 23中,但是也被頻繁使用
1.創(chuàng)建一個Animal接口
interface Shape { void draw(); }
2.創(chuàng)建Dog和Pig實現(xiàn)Animal接口
class Circle implements Shape { public Circle() { System.out.println("創(chuàng)建圓形模型"); } @Override public void draw() { System.out.println("畫了一個圓形"); } } class Square implements Shape { public Square() { System.out.println("創(chuàng)建了方形模型"); } @Override public void draw() { System.out.println("畫了一個方形"); } }
3.創(chuàng)建工廠類SimpleFactory,定義一個基于參數(shù)信息實例化具體對象的方法
public class SimpleFactory { private final static String CIRCLE = "CIRCLE"; private final static String SQUARE = "SQUARE"; public static Shape getFactory(String type) { switch (type) { case CIRCLE: return new Circle(); case SQUARE: return new Square(); default: throw new NullPointerException("未描繪任何圖形"); } } public static void main(String[] args) { Shape circle = SimpleFactory.getFactory(CIRCLE); circle.draw(); Shape square = SimpleFactory.getFactory(SQUARE); square.draw(); } }
4.日志
創(chuàng)建圓形模型 畫了一個圓形 創(chuàng)建了方形模型 畫了一個方形
分析: 從上述代碼中可以發(fā)現(xiàn),簡單工廠擁有一定判斷能力,構(gòu)建結(jié)果取決于入?yún)?,使用起來也十分的方便,也正因為使?b>太過方便而導致高耦合的情況,所有對象實例化都需要依賴它,一旦出問題,影響的會是整個系統(tǒng)
使用場景: 創(chuàng)建簡單,無復雜業(yè)務邏輯的對象
工廠方法前面說到過簡單工廠模式存在耦合,且違反了開閉原則,那么這一問題在工廠方法模式中可以很容易的解決掉,它可以做到添加新的產(chǎn)品而不破壞已有代碼
工廠方法模式:定義一個創(chuàng)建對象的接口,由它的實現(xiàn)類來決定具體實現(xiàn),其模式又被稱為工廠模式(Factory Pattern)。
1.新增ImageReaderFactory抽象工廠接口,用來構(gòu)建具體的對象
interface ImageReader { void read(); } interface ImageReaderFactory { ImageReader create(); }
2.相比單一實例化的簡單工廠模式而言,方法工廠模式更加的靈活,針對不同的產(chǎn)品(圖片讀取器)提供不同的工廠。
class JpgReader implements ImageReader { public JpgReader() { System.out.println("創(chuàng)建Jpg讀取器"); } @Override public void read() { System.out.println("讀取Jpg文件"); } } class PngReader implements ImageReader { public PngReader() { System.out.println("創(chuàng)建Png讀取器"); } @Override public void read() { System.out.println("讀取Png文件"); } } class JpgFactory implements ImageReaderFactory { @Override public ImageReader create() { System.out.println("實例化Jpg文件工廠"); return new JpgReader(); } } class PngFactory implements ImageReaderFactory { @Override public ImageReader create() { System.out.println("實例化Png文件工廠"); return new PngReader(); } }
3.創(chuàng)建測試類,當然實際使用過程中,實現(xiàn)工廠方法除了可以實例化具體對象,還可以初始化某些資源配置,比如連接池、創(chuàng)建文件等
public class MethodFactory { public static void main(String[] args) { ImageReaderFactory png = new PngFactory(); ImageReader pngReader = png.create(); pngReader.read(); ImageReaderFactory jpg = new JpgFactory(); ImageReader jpgReader = jpg.create(); jpgReader.read(); } }
4.日志
實例化Png文件工廠 創(chuàng)建Png讀取器 讀取Png文件 實例化Jpg文件工廠 創(chuàng)建Jpg讀取器 讀取Jpg文件
優(yōu)點:
屏蔽了客戶端實例化對象的細節(jié),用戶只需要關心自己使用的工廠即可。
加入新的產(chǎn)品(圖片讀取器),無需更改現(xiàn)有代碼,提高系統(tǒng)擴展性,符合開閉原則
具備多態(tài)性,又被稱為多態(tài)工廠模式
缺點: 每次需要編寫新的對象和對象工廠類,隨業(yè)務發(fā)展,一定程度上增加了系統(tǒng)復雜度
抽象工廠抽象工廠模式是為創(chuàng)建一組對象提供提供的解決方案,與工廠方法模式相比,抽象工廠模式中的具體工廠不只是創(chuàng)建某一種產(chǎn)品,而是負責一組(產(chǎn)品族)。
抽象工廠模式(Abstract Factory Pattern):提供了創(chuàng)建一系列相互依賴對象的接口,無需指定具體類
抽象工廠模式是圍繞著一個超級工廠工作,創(chuàng)造其它的工廠類,也被稱為工廠的工廠,這種類型的設計模式是創(chuàng)造性的模式,因為這種模式提供了創(chuàng)建對象的最佳方法之一。
起源抽象工廠模式的起源或者最早的應用,是用于創(chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)建。比如:命令按鍵(Button)與文字框(Text)都是視窗構(gòu)建,在UNIX操作系統(tǒng)的視窗環(huán)境和Windows操作系統(tǒng)的視窗環(huán)境中,這兩個構(gòu)建有不同的本地實現(xiàn),它們的細節(jié)有所不同。
在每一個操作系統(tǒng)中,都有一個視窗構(gòu)建組成的構(gòu)建家族。在這里就是Button和Text組成的產(chǎn)品族。而每一個視窗構(gòu)件都構(gòu)成自己的等級結(jié)構(gòu),由一個抽象角色給出抽象的功能描述,而由具體子類給出不同操作系統(tǒng)下的具體實現(xiàn)。
可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個產(chǎn)品的等級結(jié)構(gòu),分別是Button等級結(jié)構(gòu)和Text等級結(jié)構(gòu)。同時有兩個產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族。UNIX產(chǎn)品族由UNIX Button和UNIX Text產(chǎn)品構(gòu)成;而Windows產(chǎn)品族由Windows Button和Windows Text產(chǎn)品構(gòu)成。
系統(tǒng)對產(chǎn)品對象的創(chuàng)建需求由一個工程的等級結(jié)構(gòu)滿足,其中有兩個具體工程角色,即UnixFactory和WindowsFactory。UnixFactory對象負責創(chuàng)建Unix產(chǎn)品族中的產(chǎn)品,而WindowsFactory對象負責創(chuàng)建Windows產(chǎn)品族中的產(chǎn)品。這就是抽象工廠模式的應用,抽象工廠模式的解決方案如下圖:
顯然,一個系統(tǒng)只能夠在某一個操作系統(tǒng)的視窗環(huán)境下運行,而不能同時在不同的操作系統(tǒng)上運行。所以,系統(tǒng)實際上只能消費屬于同一個產(chǎn)品族的產(chǎn)品。
在現(xiàn)代的應用中,抽象工廠模式的使用范圍已經(jīng)大大擴大了,不再要求系統(tǒng)只能消費某一個產(chǎn)品族了。因此,可以不必理會前面所提到的原始用意。
摘抄自《JAVA與模式》之抽象工廠模式:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
需求: 開發(fā)一款《王者榮耀》,支持多操作系統(tǒng)和多控制方式操作控制和界面控制,并提供相應的工廠類來封裝這些類的初始化過程
1.創(chuàng)建不同的操作系統(tǒng)接口
interface Linux { void controller(); } interface Windows { void controller(); }
2.基于不同操作系統(tǒng)實現(xiàn)控制邏輯
class LinuxController implements Linux { @Override public void controller() { System.out.println("Linux 控制 《王者榮耀》"); } } class WindowsController implements Windows { @Override public void controller() { System.out.println("Windows 控制 《王者榮耀》"); } }
3.創(chuàng)建一個工廠類,基于接口分別實現(xiàn)操作控制和界面控制兩種方式的工廠
interface AbstractFactory { Linux installLinux(); Windows installWindows(); } class OperationFactory implements AbstractFactory { @Override public Linux installLinux() { System.out.println("安裝Linux操作控制系統(tǒng)"); return new LinuxController(); } @Override public Windows installWindows() { System.out.println("安裝Windows操作控制系統(tǒng)"); return new WindowsController(); } } class InterfaceFactory implements AbstractFactory { @Override public Linux installLinux() { System.out.println("安裝Linux界面控制系統(tǒng)"); return new LinuxController(); } @Override public Windows installWindows() { System.out.println("安裝Windows界面控制系統(tǒng)"); return new WindowsController(); } }
4.創(chuàng)建《王者榮耀》進行測試
public class KingGlory { public static void main(String[] args) { AbstractFactory operationFactory = new OperationFactory(); operationFactory.installLinux().controller(); operationFactory.installWindows().controller(); System.out.println("========================================================"); AbstractFactory interfaceFactory = new InterfaceFactory(); interfaceFactory.installLinux().controller(); interfaceFactory.installWindows().controller(); } }
5.日志
安裝Linux操作控制系統(tǒng) Linux 控制 《王者榮耀》 安裝Windows操作控制系統(tǒng) Windows 控制 《王者榮耀》 ======================================================== 安裝Linux界面控制系統(tǒng) Linux 控制 《王者榮耀》 安裝Windows界面控制系統(tǒng) Windows 控制 《王者榮耀》分析
使用抽象工廠模式來定義的一系列對象通常是相關或相互依賴的,這些產(chǎn)品對象就構(gòu)成了一個產(chǎn)品族,也就是抽象工廠定義了一個產(chǎn)品族。這就帶來非常大的靈活性,切換產(chǎn)品族的時候,只要提供不同的抽象工廠實現(xiàn)就可以了,也就是說現(xiàn)在是以一個產(chǎn)品族作為一個整體被切換,從上文中可以發(fā)現(xiàn),如果我們需要切換控制方式,只需要變更下對應的工廠類即可
優(yōu)點:
分離接口和實現(xiàn):客戶端使用抽象工廠來創(chuàng)建需要的對象,而客戶端根本就不知道具體的實現(xiàn)是誰,客戶端只是面向產(chǎn)品的接口編程而已。也就是說,客戶端從具體的產(chǎn)品實現(xiàn)中解耦。
切換產(chǎn)品族變得容易:對于增加新的產(chǎn)品族,抽象工廠模式很好地支持了開閉原則,只需要增加具體產(chǎn)品并對應增加一個新的具體工廠,對已有代碼無須做任何修改(如:新增一種手柄操作支持)。
缺點:
不易擴展新產(chǎn)品:如果需要給整個產(chǎn)品族添加一個新的產(chǎn)品,那么就需要修改抽象工廠,這樣就會導致修改所有的工廠實現(xiàn)類(如:新增一種操作系統(tǒng)的支持,那么Factory代碼需要全部修改)。
使用場景:
一個系統(tǒng)不應當依賴于產(chǎn)品類實例如何被創(chuàng)建、組合和表達的細節(jié),這對于所有形態(tài)的工廠模式都是重要的。
這個系統(tǒng)的產(chǎn)品有多于一個的產(chǎn)品族,而系統(tǒng)只消費其中某一族的產(chǎn)品。
同屬于同一個產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設計中體現(xiàn)出來。
系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實現(xiàn)。
- 說點什么全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter1/battcn-factory
個人QQ:1837307557
battcn開源群(適合新手):391619659
微信公眾號:battcn(歡迎調(diào)戲)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67859.html
摘要:享元模式屬于結(jié)構(gòu)型模式的一種,又稱輕量級模式,通過共享技術有效地實現(xiàn)了大量細粒度對象的復用概述兩種結(jié)構(gòu)狀態(tài)內(nèi)部狀態(tài)享元對象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。 享元模式(Flyweight Pattern)屬于結(jié)構(gòu)型模式的一種,又稱輕量級模式,通過共享技術有效地實現(xiàn)了大量細粒度對象的復用... 概述 兩種結(jié)構(gòu)狀態(tài) 內(nèi)部狀態(tài):享元對象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。 外部狀態(tài)...
摘要:構(gòu)造函數(shù)參數(shù)太多錯誤的對象狀態(tài)使用模式在我們的示例中,改造下召喚師類齊天大圣孫悟空上單基石天賦戰(zhàn)爭雷霆瘟疫之源圖奇下路基石天賦戰(zhàn)陣熱誠皎月女神戴安娜中單建造者模式讓我們寫的代碼更具可讀性,可理解為建立復雜的物體。 建造者模式(Builder Pattern)屬于創(chuàng)建型模式的一種,將多個簡單對象構(gòu)建成一個復雜的對象,構(gòu)建過程抽象化,不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象,還提供了一...
摘要:用專業(yè)的話來講設計模式是一套被反復使用多數(shù)人知曉的經(jīng)過分類編目的代碼設計經(jīng)驗的總結(jié)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。工廠方法模式的擴展性非常優(yōu)秀。工廠方法模式是典型的解耦框架。 前言 最近一直在Java方向奮斗《終于,我還是下決心學Java后臺了》,今天抽空開始學習Java的設計模式了。計劃有時間就去學習,你這么有時間,還不來一起上車嗎? 之所以要學...
摘要:原型模式是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程概述原型模式是模式的一種,其特點就是通過克隆拷貝的方式來,節(jié)約創(chuàng)建成本和資源,被拷貝的對象模型就稱之為原型。 原型模式(Prototype Pattern)是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程... 概述 ...
閱讀 1210·2021-11-10 11:35
閱讀 2951·2021-09-24 10:35
閱讀 2976·2021-09-22 15:38
閱讀 2815·2019-08-30 15:43
閱讀 1349·2019-08-29 18:39
閱讀 2592·2019-08-29 15:22
閱讀 2802·2019-08-28 18:17
閱讀 619·2019-08-26 13:37