摘要:工廠(chǎng)方法模式工廠(chǎng)方法模式是為了克服簡(jiǎn)單工廠(chǎng)模式的缺點(diǎn)。抽象工廠(chǎng)模式抽象工廠(chǎng)模式主要在于應(yīng)對(duì)新系列的需求變化。此時(shí)架構(gòu)便可以升級(jí)為工廠(chǎng)方法模式。
在面向?qū)ο缶幊讨袆?chuàng)建一個(gè)對(duì)象通常通過(guò)new關(guān)鍵字來(lái)創(chuàng)建,但是往往在一些業(yè)務(wù)場(chǎng)景下,個(gè)別對(duì)象是一個(gè)比較復(fù)雜的bean。此時(shí)“創(chuàng)建對(duì)象”不光是new了,還需要一些額外的操作,比如填充數(shù)據(jù),附屬對(duì)象的準(zhǔn)備等等。如果我們想要得到這樣的一個(gè)對(duì)象,直接簡(jiǎn)單粗暴的在需要的時(shí)候,創(chuàng)建、準(zhǔn)備數(shù)據(jù)。。。做這些操作的話(huà),那我么你的代碼將臃腫不堪,到處充斥著業(yè)務(wù)邏輯,業(yè)務(wù)需求變化時(shí),就GG了。我們身為高貴的軟件工程師,必須保持著代碼潔癖,如何提升代碼質(zhì)量呢?那就運(yùn)用到今天的主角:工廠(chǎng)模式。
介紹工廠(chǎng)模式是代替new來(lái)創(chuàng)建對(duì)象的一種設(shè)計(jì)模式,作用是降低代碼耦合度,提升程序的易擴(kuò)展性。
分類(lèi)簡(jiǎn)單工廠(chǎng)模式
工廠(chǎng)方法模式
抽象工廠(chǎng)模式
三種模式都是工廠(chǎng)模式,他們都具有工廠(chǎng)模式的優(yōu)點(diǎn),抽象程度從上到下越來(lái)越高,分別都有不同的適用場(chǎng)景,接下來(lái)逐一介紹。
一、簡(jiǎn)單工廠(chǎng)模式簡(jiǎn)單工廠(chǎng)的角色分為3個(gè)
工廠(chǎng)
抽象產(chǎn)品
具體產(chǎn)品
舉例:
比如我正在“吃雞”,跳傘剛落地,急需一把槍防身.
有如下類(lèi)
public abstract class Gun { private String name; public Gun(String name) { this.name = name; } public void shoot(){ System.out.println(name); } } public class M416 extends Gun { public M416() { super("m416"); } } public class Ak47 extends Gun { public Ak47() { super("ak47"); } }
沒(méi)有使用工廠(chǎng)模式時(shí)代碼是這樣的
Gun gun = new Ak47(); 或 Gun gun = new M416();
使用了工廠(chǎng)模式時(shí)
public class SimpleFactory { public static Gun getGun(GunType gunType){ switch (gunType){ case AK47: return new Ak47(); case M416: return new M416(); default: return null; } } public enum GunType{ AK47,M416; } }
客戶(hù)端調(diào)用:
public class SimpleFactoryClient { public static void main(String[] args) { //得到ak47 Gun gun = SimpleFactory.getGun(SimpleFactory.GunType.AK47); //得到m416 gun = SimpleFactory.getGun(SimpleFactory.GunType.M416); } }
這樣代碼就清晰多了,這就好比沒(méi)用工廠(chǎng)模式時(shí)自己要冒險(xiǎn)去找槍?zhuān)枰罉I(yè)務(wù)的細(xì)節(jié)。使用了工廠(chǎng)模式,只需要大喊一聲我要m4,就有快遞員把槍送到你面前,而不需要知道獲得槍的過(guò)程。
這就是簡(jiǎn)單工程模式,簡(jiǎn)單工程模式確實(shí)將代碼解耦了,但是如果我們想要awm呢?需要增加一種枚舉,然后多加一個(gè)case語(yǔ)句,這是不符合設(shè)計(jì)模式的開(kāi)閉原則(對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)。接下來(lái)我們介紹下一種,工廠(chǎng)方法模式。
二、工廠(chǎng)方法模式工廠(chǎng)方法的角色分為4個(gè)
抽象工廠(chǎng)
具體工廠(chǎng)
抽象產(chǎn)品
具體產(chǎn)品
舉例:
之前簡(jiǎn)單工廠(chǎng)中使用了switch case來(lái)判斷到底要返回哪個(gè)實(shí)例,此時(shí)我們可以將switch case給代替。
我們定義一個(gè)抽象的槍工廠(chǎng)
public interface GunFactory { Gun getGun(); }
然后分別定義具體的ak47工廠(chǎng)和m416工廠(chǎng)
public class Ak47Factory implements GunFactory { @Override public Gun getGun() { return new Ak47(); } } public class M416Factory implements GunFactory { @Override public Gun getGun() { return new M416(); } }
客戶(hù)端調(diào)用:
public class FactoryClient { public static void main(String[] args) { //獲取ak47 GunFactory gunFactory = new Ak47Factory(); Gun gun = gunFactory.getGun(); //獲取m416 gunFactory = new M416Factory(); gun = gunFactory.getGun(); } }
當(dāng)我們需要獲得awm時(shí),則只需要新增一個(gè)Awm類(lèi)和一個(gè)AwmFactory讓其實(shí)現(xiàn)GunFactory即可,這樣避免了寫(xiě)switch case,符合了開(kāi)閉原則。 此時(shí)有的小伙伴可能會(huì)問(wèn),最初不適用工廠(chǎng)方法時(shí)是用new Ak47()來(lái)獲得槍?zhuān)F(xiàn)在使用new Ak47Factory()不是和之前一樣嗎?說(shuō)明下,這是我假設(shè)的ak47可能僅僅只是需要new以下,但在我們實(shí)際的場(chǎng)景中,有些bean的創(chuàng)建是及其復(fù)雜,他可能是其他開(kāi)發(fā)人員負(fù)責(zé)的邏輯,你去對(duì)接時(shí)根本不需要了解其中的細(xì)節(jié),只需要獲得僅此而已。工廠(chǎng)模式就是封裝了構(gòu)建產(chǎn)品的細(xì)節(jié),客戶(hù)端根據(jù)想要的產(chǎn)品,選擇對(duì)應(yīng)的工廠(chǎng)就可獲得相應(yīng)的產(chǎn)品。
我們現(xiàn)在得到了槍?zhuān)沁€沒(méi)有子彈和配件,此時(shí)我們想要直接得到一把滿(mǎn)配的槍。
但是子彈的類(lèi)型有多種,配件的類(lèi)型也有多種,此時(shí)我們又想到了為子彈和配件創(chuàng)建工廠(chǎng),但是我們獲得一把槍滿(mǎn)配的槍并不需要知道怎么獲得子彈和配件,所以我們的槍工廠(chǎng)就要直接包含子彈工廠(chǎng)和配件工廠(chǎng),因此我們的抽象工廠(chǎng)模式呼之欲出。
抽象工廠(chǎng)的角色分為4個(gè)
抽象工廠(chǎng)
具體工廠(chǎng)
抽象產(chǎn)品(多個(gè)相同主題)
具體產(chǎn)品
舉例:
首先我們創(chuàng)建子彈的類(lèi)
public abstract class Bullet { protected String name; public Bullet(String name) { this.name = name; } public String getName() { return name; } public Bullet setName(String name) { this.name = name; return this; } } public class Ak47Bullet extends Bullet { public Ak47Bullet() { super("ak的子彈"); } } public class M416Bullet extends Bullet { public M416Bullet() { super("m416的子彈"); } }
接著是子彈工廠(chǎng)
public interface BulletFactory { Bullet getBullet(); } public class Ak47BulletFactory implements BulletFactory { @Override public Bullet getBullet() { return new Ak47Bullet(); } } public class M416BulletFactory implements BulletFactory { @Override public Bullet getBullet() { return new M416Bullet(); } }
配件的代碼與其相同只不過(guò)是名字換一個(gè),此時(shí)是不是發(fā)現(xiàn)我們的子彈工廠(chǎng)和我們之前實(shí)現(xiàn)的槍工廠(chǎng)其實(shí)是一模一樣的。我們都使用了工廠(chǎng)方法模式,但是我們最終想要獲得是完整的滿(mǎn)配的槍?zhuān)礃屩邪俗訌椇团浼?。所以抽象工廠(chǎng)模式就將一系列具有相同主題的工廠(chǎng)封裝在一起。
因此抽象工廠(chǎng)解決的范疇是產(chǎn)品族等級(jí)(完整的槍?zhuān)?,工廠(chǎng)方法模式解決的范疇是產(chǎn)品等級(jí)(子彈、配件)。
槍工廠(chǎng)
public class Ak47Factory implements GunFactory { @Override public Gun getGun() { Bullet bullet = new Ak47Bullet(); return new Ak47(bullet); } } public class Ak47 extends Gun { public Ak47(Bullet bullet) { super("ak47"); this.setBullet(bullet); } } public abstract class Gun { private String name; private Bullet bullet; public Gun(String name) { this.name = name; } public void shoot(){ System.out.println(name + "正在使用" + bullet.getName() + "射擊"); } public Bullet getBullet() { return bullet; } public Gun setBullet(Bullet bullet) { this.bullet = bullet; return this; } }
客戶(hù)端調(diào)用
public class FactoryClient { public static void main(String[] args) { //獲取ak47 GunFactory gunFactory = new Ak47Factory(); Gun gun = gunFactory.getGun(); System.out.println(gun.getBullet());//ak的子彈 //獲取m416 gunFactory = new M416Factory(); gun = gunFactory.getGun(); System.out.println(gun.getBullet());//m416的子彈 } }總結(jié)
三種工廠(chǎng)方法都有各自的優(yōu)缺點(diǎn),也有各自的試用場(chǎng)景
簡(jiǎn)單工廠(chǎng)方法:工廠(chǎng)類(lèi)含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類(lèi)的實(shí)例,客戶(hù)端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅"消費(fèi)"產(chǎn)品。耦合度低。明確區(qū)分了各自的職責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
工廠(chǎng)方法模式:工廠(chǎng)方法模式是為了克服簡(jiǎn)單工廠(chǎng)模式的缺點(diǎn)。簡(jiǎn)單工廠(chǎng)模式的工廠(chǎng)類(lèi)隨著產(chǎn)品類(lèi)的增加需要增加很多方法(或代碼),而工廠(chǎng)方法模式每個(gè)具體工廠(chǎng)類(lèi)只完成單一任務(wù),代碼簡(jiǎn)潔。工廠(chǎng)方法模式完全滿(mǎn)足OCP,即它有非常良好的擴(kuò)展性。
抽象工廠(chǎng)模式:抽象工廠(chǎng)模式主要在于應(yīng)對(duì)“新系列”的需求變化。分離了具體的類(lèi),一個(gè)抽象工廠(chǎng)創(chuàng)建了一個(gè)完整的產(chǎn)品系列,所以整個(gè)產(chǎn)品系列會(huì)立刻改變。它有利于產(chǎn)品的一致性。是對(duì)多個(gè)構(gòu)成產(chǎn)品的“零件”工廠(chǎng)的封裝,使一個(gè)切換產(chǎn)品主題變得極為容易。
其實(shí)在我們?nèi)粘W鲂枨髸r(shí),代碼的架構(gòu)可能是一步一步演化的,最開(kāi)始接到需求可能就是連三種產(chǎn)品,這是我們可能就設(shè)計(jì)成簡(jiǎn)單工廠(chǎng)模式。之后產(chǎn)品增加多了,而且其他開(kāi)發(fā)人員可能也要處理這邊的邏輯,則原先的switch case很有可能就會(huì)成為bug的伏筆。此時(shí)架構(gòu)便可以升級(jí)為工廠(chǎng)方法模式。再后來(lái)原來(lái)的產(chǎn)品變得龐大且復(fù)雜,需要將產(chǎn)品設(shè)計(jì)成多個(gè)零件構(gòu)成,此時(shí)架構(gòu)又可以升級(jí)成抽象工廠(chǎng)模式,將耦合度進(jìn)一步降低,之后其他的開(kāi)發(fā)者想要新增產(chǎn)品,一看結(jié)構(gòu)清晰明了,便可以高質(zhì)量的完成工作,早早下班回家。
設(shè)計(jì)模式幫助我們提升代碼質(zhì)量,每種設(shè)計(jì)模式都有其適合的場(chǎng)景,切勿過(guò)度設(shè)計(jì),讓技術(shù)推動(dòng)業(yè)務(wù),不定時(shí)重構(gòu)代碼,不斷構(gòu)造更好的自己。
歡迎各路大神不吝賜教。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68166.html
摘要:基于工廠(chǎng)角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠(chǎng)方法模式的關(guān)鍵。工廠(chǎng)方法模式之所以又被稱(chēng)為多態(tài)工廠(chǎng)模式,是因?yàn)樗械木唧w工廠(chǎng)類(lèi)都具有同一抽象父類(lèi)。工廠(chǎng)方法模式總結(jié)工廠(chǎng)方法模式是簡(jiǎn)單工廠(chǎng)模式的進(jìn)一步抽象和推廣。 JavaScript工廠(chǎng)模式 首先需要說(shuō)一下工廠(chǎng)模式。工廠(chǎng)模式根據(jù)抽象程度的不同分為三種 簡(jiǎn)單工廠(chǎng)模式 工廠(chǎng)方法模式 抽象工廠(chǎng)模式 1.簡(jiǎn)單工廠(chǎng)模式 簡(jiǎn)單工廠(chǎng)模式:又稱(chēng)為靜態(tài)工廠(chǎng)方法...
摘要:不過(guò)怎么來(lái)說(shuō)工廠(chǎng)方法模式是簡(jiǎn)單工廠(chǎng)模式的升級(jí)版。其次,工廠(chǎng)模式是一種典型的解耦模式,迪米特法則在工廠(chǎng)模式中表現(xiàn)的尤為明顯。 工廠(chǎng)模式想必大家在開(kāi)發(fā)過(guò)程中會(huì)經(jīng)常用到,顧名思義其就是作為一個(gè)工廠(chǎng)用來(lái)生產(chǎn)產(chǎn)品的,下面來(lái)簡(jiǎn)單介紹幾種常見(jiàn)的工廠(chǎng)模式。 0x01 簡(jiǎn)單工廠(chǎng)模式 1、類(lèi)圖結(jié)構(gòu)showImg(/img/bVFf1t?w=531&h=278); 2、角色分類(lèi) 工廠(chǎng)類(lèi):其內(nèi)部具有一點(diǎn)的判...
摘要:二簡(jiǎn)單工廠(chǎng)模式組成工廠(chǎng)類(lèi)工廠(chǎng)模式的核心,通過(guò)調(diào)用它來(lái)實(shí)現(xiàn)其他類(lèi)的功能。三工廠(chǎng)方法模式利用工廠(chǎng)方法模式可以有效解決簡(jiǎn)單工廠(chǎng)模式破壞開(kāi)閉原則的問(wèn)題。 一、概念 1、工廠(chǎng)模式分為三類(lèi):(1)簡(jiǎn)單工廠(chǎng)模式:一個(gè)工廠(chǎng)創(chuàng)建所有產(chǎn)品(2)工廠(chǎng)方法模式:一個(gè)工廠(chǎng)方法創(chuàng)建一個(gè)產(chǎn)品(3)抽象工廠(chǎng)模式:一個(gè)工廠(chǎng)方法創(chuàng)建一類(lèi)產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實(shí)例的創(chuàng)建和使用分離開(kāi)來(lái),隱藏類(lèi)實(shí)例的創(chuàng)建細(xì)節(jié),外界...
摘要:簡(jiǎn)單工廠(chǎng),工廠(chǎng)模式和抽象工廠(chǎng)。不要認(rèn)為簡(jiǎn)單工廠(chǎng)是用就覺(jué)得一無(wú)是處,也不要覺(jué)得抽象工廠(chǎng)比較高大上就到處套。 工廠(chǎng)模式,實(shí)際上也會(huì)根據(jù)業(yè)務(wù)情景不同會(huì)有不同的實(shí)現(xiàn)方式。一般分為3種。簡(jiǎn)單工廠(chǎng),工廠(chǎng)模式和抽象工廠(chǎng)。顧名思義,這三種從簡(jiǎn)單到抽象,名稱(chēng)越來(lái)越高大上,實(shí)現(xiàn)方式肯定是越來(lái)越復(fù)雜 結(jié)論1:三種工廠(chǎng)的實(shí)現(xiàn)越來(lái)越復(fù)雜 簡(jiǎn)單工廠(chǎng) public class Factory { // 定義...
摘要:我認(rèn)為按書(shū)上的順序比較好理解因?yàn)楹?jiǎn)單靜態(tài)工廠(chǎng)模式是在工廠(chǎng)方法模式上縮減,抽象工廠(chǎng)模式是在工廠(chǎng)方法模式上再增強(qiáng)。所以我就先講工廠(chǎng)方法模式了。抽象工廠(chǎng)模式抽象工廠(chǎng)模式就比較復(fù)雜了,我們一般的應(yīng)用都寫(xiě)不到。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡(jiǎn)單啦 單例模式你會(huì)幾種寫(xiě)法? 昨天寫(xiě)了單例模式了,今天是時(shí)候?qū)懝S(chǎng)模式啦~ 工廠(chǎng)模式我個(gè)人認(rèn)為其實(shí)比...
閱讀 1991·2021-09-26 10:19
閱讀 3266·2021-09-24 10:25
閱讀 1654·2019-12-27 11:39
閱讀 1937·2019-08-30 15:43
閱讀 683·2019-08-29 16:08
閱讀 3515·2019-08-29 16:07
閱讀 915·2019-08-26 11:30
閱讀 1279·2019-08-26 10:41