国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
回復(fù)內(nèi)容:
首頁 后端開發(fā) php教程 實際開發(fā)中哪些場景需要用到工廠模式?

實際開發(fā)中哪些場景需要用到工廠模式?

Jul 06, 2016 pm 01:51 PM
c# c++ java php 設(shè)計模式

工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產(chǎn)品。

  1. 工廠模式

  2. 簡單工廠模式

  3. 抽象工廠模式

請問實際開發(fā)中哪些情況下會用到它?為什么我感覺我現(xiàn)在開發(fā)很少會用到這些設(shè)計模式啊。。。

回復(fù)內(nèi)容:

工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產(chǎn)品。

  1. 工廠模式

  2. 簡單工廠模式

  3. 抽象工廠模式

請問實際開發(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)建型模式,都是一個目的——為了初始化一個對象。或者說,為了構(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ù)雜的過程不向外暴露,如果暴露了這些過程,會對使用者增加麻煩,這也就是所謂的團隊合作。

面向?qū)ο蠓庋b的本身也就是為了使得對外的 API 盡可能的簡化。

例如,你定義了一個 Status字段,但這個字段因為某些業(yè)務(wù)原因,需要使用整數(shù)來表示狀態(tài)。那么,如果數(shù)字少了還好辦,如果數(shù)字多了,上層使用者就不一定能記清楚每個數(shù)字代表的狀態(tài)(比如你要做語音通信系統(tǒng),那么,語音設(shè)備是有很多狀態(tài)數(shù)字的)。這時,如果使用 new來創(chuàng)建對象,然后再對 Status 進行賦值,不可避免的,可能要查閱開發(fā)文檔,或者會不小心給出一個錯誤的值。這時,你就不妨使用工廠模式,或者其它合適的設(shè)計模式,來進行代碼的建設(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è)計模式,能不能為你的團隊成員帶來方便,或者提升代碼質(zhì)量,避免一些錯誤。如果是,就用,如果僅僅帶來了復(fù)雜,并沒有益處,那還是算了。

一句話,沒有該不該用,也沒有哪些需要不需要用,用就要帶來效益,無論是對團隊還是產(chǎn)品質(zhì)量或產(chǎn)品的可維護性。用不用,要以團隊配合和產(chǎn)品為導(dǎo)向,這才是對一個軟件設(shè)計師的基本要求。

工廠的職能就是你給它一個模型或者具體的樣品需求,它給你一個成品。工廠模式也是這樣的道理,比如,你入?yún)⑹莂,它就給你一個A對象,你入?yún),它就給你生產(chǎn)一個B對象,這里a,b就是你讓工廠生產(chǎn)的商品具體需求,如長寬高等。

工廠模式還是很常見的,你沒用到可能是因為項目規(guī)模小,或者是類不夠抽象。

工廠你可以理解為隱藏了內(nèi)部細節(jié),你調(diào)用工廠的生產(chǎn)API ,直接獲得所描述的物體,具體怎么生產(chǎn)的,你不用去關(guān)注細節(jié),因為有的東西簡單,直接new出來就可以了,但有的很復(fù)雜,比如spring的注入鏈。要理解工廠模式,建議看看spring實現(xiàn)的factory。

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

什么是正確的啟動。用于在Linux上使用GDB調(diào)試C應(yīng)用程序的JSON設(shè)置? 什么是正確的啟動。用于在Linux上使用GDB調(diào)試C應(yīng)用程序的JSON設(shè)置? Aug 04, 2025 am 03:46 AM

todebugac Application usinggdbinvisualStudiocode,configureTheLaunch.jsonFileCortly; keySettingSincludEsTeScifiewingTheexecutableWithWith program“ program”,將“ mimode”設(shè)置為“ gdb”和“ gdb”和“ type” type“ type” to type“ to” type to ty ty'cppdbg

YII開發(fā)人員:掌握基本技術(shù)技能 YII開發(fā)人員:掌握基本技術(shù)技能 Aug 04, 2025 pm 04:54 PM

要成為Yii大師,需要掌握以下技能:1)理解Yii的MVC架構(gòu),2)熟練使用ActiveRecordORM,3)有效利用Gii代碼生成工具,4)掌握Yii的驗證規(guī)則,5)優(yōu)化數(shù)據(jù)庫查詢性能,6)持續(xù)關(guān)注Yii生態(tài)系統(tǒng)和社區(qū)資源。通過這些技能的學(xué)習(xí)和實踐,可以全面提升在Yii框架下的開發(fā)能力。

如何比較Java中的兩個字符串? 如何比較Java中的兩個字符串? Aug 04, 2025 am 11:03 AM

使用.equals()方法比較字符串內(nèi)容,因為==僅比較對象引用而非內(nèi)容;1.使用.equals()比較字符串值是否相等;2.使用.equalsIgnoreCase()進行忽略大小寫的比較;3.使用.compareTo()按字典順序比較字符串,返回0、負數(shù)或正數(shù);4.使用.compareToIgnoreCase()進行忽略大小寫的字典序比較;5.使用Objects.equals()或安全調(diào)用方式處理null字符串,避免空指針異常。總之,應(yīng)避免使用==進行字符串內(nèi)容比較,除非明確需要檢查對象是否相

在C#應(yīng)用中實現(xiàn)設(shè)計模式 在C#應(yīng)用中實現(xiàn)設(shè)計模式 Aug 04, 2025 am 03:21 AM

設(shè)計模式在C#中用于解決常見結(jié)構(gòu)問題,提升代碼可維護性與降低耦合度。1.單例模式適用于全局唯一實例,如日志記錄器;2.工廠模式用于隱藏復(fù)雜創(chuàng)建邏輯,如動態(tài)創(chuàng)建數(shù)據(jù)源;3.觀察者模式適用于事件驅(qū)動場景,如UI更新。使用時應(yīng)判斷是否存在重復(fù)代碼、未來是否易變、團隊是否熟悉,避免過度設(shè)計,建議從簡單封裝開始逐步演進。

如何在Java加入一系列字符串? 如何在Java加入一系列字符串? Aug 04, 2025 pm 12:55 PM

使用String.join()(Java8 )是連接字符串?dāng)?shù)組最簡單推薦的方法,直接指定分隔符即可;2.對于舊版本Java或需要更多控制時,可使用StringBuilder手動遍歷并拼接;3.StringJoiner適用于需要前綴、后綴等更靈活格式的場景;4.使用Arrays.stream()結(jié)合Collectors.joining()適合在連接前對數(shù)組進行過濾或轉(zhuǎn)換等操作;綜上所述,若使用Java8及以上版本,大多數(shù)情況下應(yīng)首選String.join()方法,語法簡潔易讀,而對于復(fù)雜邏輯則推薦

如何在Java中使用線程池? 如何在Java中使用線程池? Aug 04, 2025 am 02:54 AM

使用線程池可提升性能并減少開銷,答案是通過重用線程來高效處理多任務(wù);1.選擇合適的線程池類型,如newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor或newScheduledThreadPool,生產(chǎn)環(huán)境推薦直接使用ThreadPoolExecutor以獲得更好控制;2.提交任務(wù)時可使用Runnable(無返回值)或Callable(有返回結(jié)果,并通過Future獲?。?.必須正確關(guān)閉線程池,先調(diào)用shutdown(),再

Python記錄到文件示例 Python記錄到文件示例 Aug 04, 2025 pm 01:37 PM

Python的logging模塊可通過FileHandler將日志寫入文件,首先調(diào)用basicConfig配置文件處理器和格式,如設(shè)置level為INFO、使用FileHandler寫入app.log;其次可添加StreamHandler實現(xiàn)同時輸出到控制臺;進階場景可用TimedRotatingFileHandler按時間分割日志,例如設(shè)置when='midnight'實現(xiàn)每日生成新文件并保留7天備份,需確保日志目錄存在;建議使用getLogger(__name__)創(chuàng)建命名logger,生產(chǎn)

See all articles