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

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Um ein Meister von YII zu werden, müssen Sie die folgenden F?higkeiten beherrschen: 1) Verstehen Sie die MVC -Architektur von YII, 2) die Verwendung von ActInereCordorm, 3) GII -Code -Erzeugungstools effektiv verwenden, 4) Master Yii -überprüfungsregeln, 5) Optimieren von Datenbankabfrage -Leistung, 6) Ressourcen der Datenbankabfrage und Community -Ressourcen. Durch das Lernen und die Praxis dieser F?higkeiten k?nnen die Entwicklungsf?higkeiten im Rahmen des YII -Frameworks umfassend verbessert werden.

Zun?chst checkifthefnkeysettingIssinterferingbyingbothThevolumeKeyaloneAndfn VolumeKey, thentogglefnlockwithfn EscifAvailable

Verwenden Sie die Methode .equals (), um den String -Inhalt zu vergleichen, da == nur Objektreferenzen als Inhalt vergleichen; 1. Verwenden Sie .Equals (), um die Zeichenfolgenwerte gleicherma?en zu vergleichen; 2. Verwenden Sie .EqualSignoreCase (), um das Ignorieren zu vergleichen; 3. verwenden. Compareto (), um Zeichenfolgen in der W?rterbuchreihenfolge zu vergleichen, wobei 0, negative oder positive Zahlen zurückgegeben werden; V. 5. Objekte verwenden. Ausgleich () oder Safe Call -Methode, um Null -Zeichenfolgen zu verarbeiten, um Null -Zeiger -Ausnahmen zu vermeiden. Kurz gesagt, Sie sollten vermeiden, == für String -Inhaltsvergleiche zu verwenden, es sei denn, es ist ausdrücklich erforderlich, zu überprüfen, ob sich das Objekt in der Phase befindet.

Die Verwendung von String.Join () (Java8) ist die am einfachsten empfohlene Methode zum Anschlie?en von String -Arrays. Geben Sie einfach den Trennzeichen direkt an. 2. Für alte Versionen von Java oder wenn mehr Kontrolle ben?tigt wird, k?nnen Sie StringBuilder verwenden, um manuell zu durchqueren und zu splei?en. 3.. Stringjoiner eignet sich für Szenarien, die flexiblere Formate wie Pr?fixe und Suffixe erfordern. V. Zusammenfassend sollte die Methode String.Join () in den meisten F?llen bevorzugt werden, wenn Java8 und h?her verwendet wird.

Das Protokollierungsmodul von Python kann Protokolle über FileHandler in Dateien schreiben. Rufen Sie zun?chst den Prozessor und das Format der BasicConfig -Konfigurationsdatei auf, z. Zweitens fügen Sie StreamHandler hinzu, um gleichzeitig die Ausgabe an die Konsole zu erreichen. Fortgeschrittene Szenarien k?nnen TimedrotatingFileHandler verwenden, um Protokolle nach Zeit zu teilen, z. B. Einstellung, wann = 'Mitternacht' jeden Tag neue Dateien generiert und 7 Tage Backup beibehalten, und sicherzustellen, dass das Protokollverzeichnis existiert. Es wird empfohlen, GetLogger (__ Name__) zu verwenden, um benannte Logger zu erstellen und zu produzieren

Berechnet hat einen Cache, und mehrere Zugriffe werden nicht neu berechnet, wenn die Abh?ngigkeit unver?ndert bleibt, w?hrend Methoden jedes Mal ausgeführt werden, wenn sie aufgerufen werden. 2. Computed eignet sich für Berechnungen basierend auf reaktionsschnellen Daten. Methoden eignen sich für Szenarien, in denen Parameter erforderlich sind, oder h?ufige Aufrufe, das Ergebnis h?ngt jedoch nicht von reaktionsschnellen Daten ab. 3. Computed unterstützt Getter und Setzer, die die Zwei-Wege-Synchronisation von Daten realisieren k?nnen. Methoden werden jedoch nicht unterstützt. 4. Zusammenfassung: Verwenden Sie zuerst berechnet, um die Leistung zu verbessern und Methoden zu verwenden, wenn sie Parameter übergeben, Vorg?nge ausführen oder Cache vermeiden. Nach dem Prinzip "Wenn Sie berechnet k?nnen, verwenden Sie keine Methoden".

Breakexitstheloopmed sofort nach der Findingingatarget, idealforstoppingTheFirstmatch.2.ContinueskipTheCrourrentiteration, nützlichFilteringitemsliketemporaryFiles
