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