设计模式之 - 简单工厂模式
一、什么是簡單工廠模式
簡單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。在簡單工廠模式中,一個抽象的產(chǎn)品類,可以派生出多個具體的產(chǎn)品類,它們都具有共同的父類。
我們再來看下簡單工廠模式的UML圖:
二、簡單工廠模式的構(gòu)成
工廠類:工廠類是我們的核心類,它負責創(chuàng)建所有實例的內(nèi)部邏輯,工廠類可以直接被調(diào)用創(chuàng)建我們的產(chǎn)品實例。
抽象產(chǎn)品類:簡單工廠模式所創(chuàng)建的所有對象的父類,它負責描述所有實例所擁有的公共接口。
具體產(chǎn)品類:簡單工廠所創(chuàng)建的具體的實例對象。
三、實例演示
我們做這個一個分析,有一家造車廠它里面可以造車的各個零件,在這個廠里,有專門造輪胎的車間,有專門造發(fā)動機的車間還有換門造車玻璃的車間,那么我們想一下,這些車間是不是都是歸屬于這個造車廠的,每個車間是不是都有自己的職能。
假設(shè)我們現(xiàn)在組裝車間要組裝一輛車,他們需要發(fā)動機、輪胎、玻璃等部件,那么作為組裝車的人,他們根本不關(guān)心你怎么做,他們只關(guān)心這個東西做沒做好,做好了趕緊遞過來,我這邊要用。
我們先來創(chuàng)建一個造車廠的類:
public interface CarFactory { void ability();}復(fù)制代碼我們既然有了造車廠,那么我們地下的車間部門只需要實現(xiàn)這個類,去完成各自的職能就可以了
玻璃車間:
public class Glass implements CarFactory{ @Override public void ability() { System.out.println("玻璃已經(jīng)生產(chǎn)好了"); }}復(fù)制代碼發(fā)動機車間:
public class Engine implements CarFactory { @Override public void ability() { System.out.println("發(fā)動機制造好了"); }}復(fù)制代碼輪胎車間:
public class AutoTyre implements CarFactory{ @Override public void ability() { System.out.println("輪胎已經(jīng)生產(chǎn)好了"); }}復(fù)制代碼既然已經(jīng)有個產(chǎn)品類和具體的產(chǎn)品,那么接下來我們是不是要做一個工廠去進行生產(chǎn)啊,工廠類是整個模式的關(guān)鍵,它需要進行必要的邏輯判斷,根據(jù)消費者給的信息,它需要決定來創(chuàng)建哪個對象的實例,消費者不再關(guān)心如何創(chuàng)建具體的產(chǎn)品,他只需要負責好需要生產(chǎn)的產(chǎn)品就行了。
public class Product { public static CarFactory product(String skill) { CarFactory carFactory = null; switch (skill) { // 制造輪胎 case "autoTyre": carFactory = new AutoTyre(); break; // 制造發(fā)動機 case "engine": carFactory = new Engine(); break; // 制造玻璃 case "glass": carFactory = new Glass(); } return carFactory; }}復(fù)制代碼在這里我們可以發(fā)現(xiàn),所有類都有一個共同的父類,到這里大家應(yīng)該可以發(fā)現(xiàn),我們平時所說的封裝、繼承、多態(tài)在這里是不是已經(jīng)體現(xiàn)出來了(這里面我沒用繼承,是因為Java是單繼承的,所以我這里改為了接口實現(xiàn)的方式,因為Java是可以多實現(xiàn)的,這樣有利于我們程序的擴展)。
接下里,我們來看下組裝車間是怎么來索要所需的部件的
public class CarMain { public static void main(String[] args) { // 生產(chǎn)一個發(fā)動機 CarFactory engine = Product.product("engine"); engine.ability(); // 生產(chǎn)一個玻璃 CarFactory glass = Product.product("glass"); glass.ability(); // 生產(chǎn)一個輪胎 CarFactory autoTyre = Product.product("autoTyre"); autoTyre.ability(); }}復(fù)制代碼我們先來看下結(jié)果:
如果我們想要再去生產(chǎn)其他的一些部件,我們只需要去實現(xiàn)造車廠的類,完成自己特定的職能就可以了,也不會去跟其他的車間有任何的交集,我們只需要完成我們的需要做的東西就好。
四、模式優(yōu)點
首先程序?qū)崿F(xiàn)了解耦和,大大降低的程序之間的耦合性,我們增加車間不會影響到其他的車間進度;
提高了程序的擴展性,如果我們想要增加一個車間,那么只需要實現(xiàn)造車廠類,完成自己的職能就好;
組裝車間可以免除直接創(chuàng)建對象的責任,他不需要自己直接去創(chuàng)建,而是通過我們專門的工廠類來創(chuàng)建,他只需要告訴我們他需要什么東西;
五、簡單工廠模式的缺點
首先大家應(yīng)該可以明顯的發(fā)現(xiàn),如果我們每增加一個產(chǎn)品,那相應(yīng)的我們就要增加一個子工廠,這樣額外的加大了我們的開發(fā)量;
由于工廠類集中了所有實例的創(chuàng)建邏輯,違反了高類聚責任分配原則;
六、使用場景
工廠類創(chuàng)建的對象比較少;
消費者只需要傳進工廠類的參數(shù),對于如何創(chuàng)建對象不關(guān)心;
原文鏈接
轉(zhuǎn)載于:https://juejin.im/post/5bda4d7b5188257fa148e920
總結(jié)
以上是生活随笔為你收集整理的设计模式之 - 简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx测试小结
- 下一篇: WPF 曲线图表控件(自制)(二)