實(shí)際開(kāi)發(fā)中哪些場(chǎng)景需要用到工廠模式?
Jul 06, 2016 pm 01:51 PM
工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠模式
簡(jiǎn)單工廠模式
抽象工廠模式
請(qǐng)問(wèn)實(shí)際開(kāi)發(fā)中哪些情況下會(huì)用到它?為什么我感覺(jué)我現(xiàn)在開(kāi)發(fā)很少會(huì)用到這些設(shè)計(jì)模式啊。。。
回復(fù)內(nèi)容:
工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠模式
簡(jiǎn)單工廠模式
抽象工廠模式
請(qǐng)問(wèn)實(shí)際開(kāi)發(fā)中哪些情況下會(huì)用到它?為什么我感覺(jué)我現(xiàn)在開(kāi)發(fā)很少會(huì)用到這些設(shè)計(jì)模式啊。。。
我先說(shuō)下 我目前看到用到了工廠模式的例子:
一般的MVC框架中,都有一個(gè)基本的DB數(shù)據(jù)庫(kù)基本操作類
我叫它DB class,有一個(gè)baseModel class 去繼承 db class
baseModel 是所有框架model的基類,需要繼承baseModel
baseModel已經(jīng)有db類的 增刪查改的方法了,baseModel其實(shí)就是數(shù)據(jù)庫(kù)工廠,不同的模型繼承baseModel,就有操作不同數(shù)據(jù)表的對(duì)象實(shí)例了,這樣就用一個(gè)基礎(chǔ)的class 完成了實(shí)例化各個(gè)不同數(shù)據(jù)表的對(duì)象,就好像是工廠一樣,傳不同的表名字就返回給你不同的對(duì)象。
我的理解就是這樣的,如有誤,還請(qǐng)包涵和斧正。
工廠模式是一個(gè)用于實(shí)例化對(duì)象的模式,是用工廠方法代替new操作的一種方式。工廠模式在Java項(xiàng)目中到處都是,因?yàn)楣S模式就相當(dāng)于創(chuàng)建實(shí)例對(duì)象的new,如在我們的系統(tǒng)中經(jīng)常需要記日志,如果創(chuàng)建logger實(shí)例時(shí)所做的初始化工作可能是很長(zhǎng)一段代碼,可能要初始化、賦值、查詢數(shù)據(jù)等等,則會(huì)導(dǎo)致代碼臃腫而難看。
<code> private static Logger logger = LoggerFactory.getLogger(MyBusinessRPC.class); public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); } public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE == UNINITIALIZED) { INITIALIZATION_STATE = ONGOING_INITIALIZATION; performInitialization(); } switch (INITIALIZATION_STATE) { case SUCCESSFUL_INITIALIZATION: return StaticLoggerBinder.getSingleton().getLoggerFactory(); case NOP_FALLBACK_INITIALIZATION: return NOP_FALLBACK_FACTORY; case FAILED_INITIALIZATION: throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); case ONGOING_INITIALIZATION: // support re-entrant behavior. // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106 return TEMP_FACTORY; } throw new IllegalStateException("Unreachable code"); }</code>
想理解工廠模式的話就不能不知道簡(jiǎn)單工廠模式了。
<code> switch ($type) { case '存款職員': $man = new Depositer; break; case '銷售': $man = new Marketer; break; case '接待': $man = new Receiver; break; default: echo '傳輸參數(shù)有誤,不屬于任何一個(gè)職位'; break; } </code>
諾,這就是簡(jiǎn)單工廠模式,是不是很常見(jiàn),簡(jiǎn)單工廠模式有一個(gè)不足,他雖然遵循了單一職責(zé)原則,但它違反了另一條很重要的原則:開(kāi)放封閉原則。如果新增一個(gè)文員職位,那么我們還要修改對(duì)應(yīng)代碼,增加一個(gè)case,這是很可怕的,因?yàn)閷懞玫拇a如果我們?cè)偃バ薷目赡軙?huì)造成未知的效果。
而工廠模式就是對(duì)簡(jiǎn)單工廠的一次升級(jí),這里以MVC里的DB class來(lái)說(shuō)明,外部調(diào)用的時(shí)候只需選擇自己所需的表名,該工廠會(huì)去調(diào)用真實(shí)數(shù)據(jù)庫(kù)處理方法,然后返回你想要的結(jié)果。
不論是工廠模式還是其它創(chuàng)建型模式,都是一個(gè)目的——為了初始化一個(gè)對(duì)象?;蛘哒f(shuō),為了構(gòu)建一個(gè)數(shù)據(jù)結(jié)構(gòu)模型(類和對(duì)象本身就是一種自定義的數(shù)據(jù)結(jié)構(gòu))。
那么,問(wèn)題來(lái)了,為什么有 new
這樣方式可以創(chuàng)建一個(gè)對(duì)象,還要使用設(shè)計(jì)模式。本質(zhì)上就是一個(gè)原因,不想讓上層使用者直接使用 new 來(lái)初始化對(duì)象。
這樣的原因有很多,絕大多數(shù)原因就是對(duì)上層的使用者隔離對(duì)象創(chuàng)建的過(guò)程;或者是對(duì)象創(chuàng)建的過(guò)程復(fù)雜,使用者不容易掌握;或者是對(duì)象創(chuàng)建要滿足某種條件,這些條件是業(yè)務(wù)的需求也好,是系統(tǒng)約束也好,沒(méi)有必要讓上層使用者掌握,增加別人開(kāi)發(fā)的難度。
所以,到這時(shí)我們應(yīng)該清楚了,無(wú)論是工廠模式,還是上面的戰(zhàn)友說(shuō)的開(kāi)閉原則,都是為了隔離一些復(fù)雜的過(guò)程,使得這些復(fù)雜的過(guò)程不向外暴露,如果暴露了這些過(guò)程,會(huì)對(duì)使用者增加麻煩,這也就是所謂的團(tuán)隊(duì)合作。
面向?qū)ο蠓庋b的本身也就是為了使得對(duì)外的 API
盡可能的簡(jiǎn)化。
例如,你定義了一個(gè) Status
字段,但這個(gè)字段因?yàn)槟承I(yè)務(wù)原因,需要使用整數(shù)來(lái)表示狀態(tài)。那么,如果數(shù)字少了還好辦,如果數(shù)字多了,上層使用者就不一定能記清楚每個(gè)數(shù)字代表的狀態(tài)(比如你要做語(yǔ)音通信系統(tǒng),那么,語(yǔ)音設(shè)備是有很多狀態(tài)數(shù)字的)。這時(shí),如果使用 new
來(lái)創(chuàng)建對(duì)象,然后再對(duì) Status
進(jìn)行賦值,不可避免的,可能要查閱開(kāi)發(fā)文檔,或者會(huì)不小心給出一個(gè)錯(cuò)誤的值。這時(shí),你就不妨使用工廠模式,或者其它合適的設(shè)計(jì)模式,來(lái)進(jìn)行代碼的建設(shè)。
比如,這樣:
<code>public static class Factory { public static Ixxxxxx CreateWithOpen() { var obj = new Obj(); obj.Status = 1; return obj; } public static Ixxxxxx CreateWithClose() { var obj = new Obj(); obj.Status = 2; return obj; } } </code>
當(dāng)然,使用枚舉也行,這個(gè)說(shuō)白了,就是看設(shè)計(jì)者的意愿了。
所以,設(shè)計(jì)模式?jīng)]有說(shuō)必需在哪個(gè)場(chǎng)景中使用,更確切的說(shuō),應(yīng)該是,當(dāng)你使用了設(shè)計(jì)模式,能不能為你的團(tuán)隊(duì)成員帶來(lái)方便,或者提升代碼質(zhì)量,避免一些錯(cuò)誤。如果是,就用,如果僅僅帶來(lái)了復(fù)雜,并沒(méi)有益處,那還是算了。
一句話,沒(méi)有該不該用,也沒(méi)有哪些需要不需要用,用就要帶來(lái)效益,無(wú)論是對(duì)團(tuán)隊(duì)還是產(chǎn)品質(zhì)量或產(chǎn)品的可維護(hù)性。用不用,要以團(tuán)隊(duì)配合和產(chǎn)品為導(dǎo)向,這才是對(duì)一個(gè)軟件設(shè)計(jì)師的基本要求。
工廠的職能就是你給它一個(gè)模型或者具體的樣品需求,它給你一個(gè)成品。工廠模式也是這樣的道理,比如,你入?yún)⑹莂,它就給你一個(gè)A對(duì)象,你入?yún),它就給你生產(chǎn)一個(gè)B對(duì)象,這里a,b就是你讓工廠生產(chǎn)的商品具體需求,如長(zhǎng)寬高等。
工廠模式還是很常見(jiàn)的,你沒(méi)用到可能是因?yàn)轫?xiàng)目規(guī)模小,或者是類不夠抽象。
工廠你可以理解為隱藏了內(nèi)部細(xì)節(jié),你調(diào)用工廠的生產(chǎn)API ,直接獲得所描述的物體,具體怎么生產(chǎn)的,你不用去關(guān)注細(xì)節(jié),因?yàn)橛械臇|西簡(jiǎn)單,直接new出來(lái)就可以了,但有的很復(fù)雜,比如spring的注入鏈。要理解工廠模式,建議看看spring實(shí)現(xiàn)的factory。

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

Todebugac ApplicationSuinggdbinvisualstudiocode, configurethelaunch.jsonFileCorrectly; KeysettingSincutablePathWith "????"? "gdb"? "type"? ???? "CPPDBG"? ?????

YII? ???? ??? ?? ??? ????????. 1) YII? MVC ???? ??, 2) Activerecordorm ??? ?????. 3) GII ?? ?? ??, 4) ??? YII? ?? ??, 5) ?????? ?? ??? ???????. ??? ??? ??? ??? ?? YII ??? ?? ?? ?? ??? ????? ?? ? ? ????.

.quals () ???? ???? ??? ??? ??????. == ?????? ?? ?? ? ?????; 1. .Equals ()? ???? ??? ?? ???? ?????. 2. .EqualSignoreCase ()? ???? ??? ???? ?? ?????. 3. .compareto ()? ???? ?? ??? ???? ???? 0, ?? ?? ?? ??? ?????. 4. .comparetoignorecase ()? ???? ?? ??? ?????. 5. Objects.equals () ?? ??? ?? ??? ???? ? ??? ??? ??? ?? ? ???? ?????. ???, ??? ?? ???? ==? ???? ??????.

String.join () (Java8) ??? ??? ??? ???? ?? ???? ?????. ???? ?? ??????. 2. ?? ??? Java ?? ? ?? ??? ??? ?? StringBuilder? ???? ???? ???? ?? ???? ??? ? ????. 3. StringJoiner? ??? ? ???? ???? ??? ??? ??? ????? ?????. 4. arrays.stream ()? Collectors.joining ()? ???? ???? ?? ??? ?????? ???? ? ?????. ????, Java8 ??? ???? ??, ???? ?? String.join () ???? ?????? ???? ?? ??? ??? ???? ?????.

Computed?? ??? ??? ???? ???? ?? ????? ?? ?? ???? ? ???? ???, ??? ?? ? ??? ??? ?????. 2. Computed? ?? ? ???? ???? ??? ?????. ???? ?? ??? ????? ??? ?? ???? ????? ????? ??? ?? ???? ???? ????. 3. Computed Getters ? Setters? ???? ??? ???? ??? ? ??? ??? ???? ????. 4. ?? : ?? ???? ???? ??? ????? ?? ??? ????? ??? ????? ??? ?? ? ???? ???? "???? ??? ? ??? ???? ???? ????"?? ??? ?? ??? ??????.

??, CheckifTefnKeysettingISTINGINTERINGITERINGBOTHOLMEKEYALONEANDFN VOLUMEKEY, thentogglefnlockwithfn escifavailable.2. enterbios/uefiduringbootandenablefunctekysordisordablehotkeymodetoensurevolumeysarerecognized.3.updateOrreeinstalliodriv

Python? ?? ??? ?? ???? ?? ??? ??? ? ? ????. ??, FileHandler? ???? app.log? ?? ?? info? ?? ??? ?? BasicConfig ?? ?? ???? ? ??? ??????. ??, Streamhandler? ???? ??? ??? ??? ??????. ?? ????? TimedRotatingFileHandler? ???? ???? ??? ??? ?? ? ??? ???? 7 ?? ??? ???? ?? ????? ????? ??? ?? ?? ? ????. GetLogger (__ name__)? ???? ?? ? ??? ??? ???? ?? ????.
