對(duì)象創(chuàng)建模式

通過(guò)“對(duì)象創(chuàng)建”模式繞開(kāi)new,來(lái)避免對(duì)象創(chuàng)建(new)過(guò)程中所導(dǎo)致的緊耦合(依賴(lài)工具類(lèi)),從而支持對(duì)象創(chuàng)建的穩(wěn)定敲董。它是接口抽象之后的第一步工作紫皇。

典型模式

  • Factory Method
  • Abstract Factory
  • Prototype
  • Builder

Factory Method 工廠(chǎng)方法

動(dòng)機(jī)

  • 在軟件系統(tǒng)中,經(jīng)常面臨著創(chuàng)建對(duì)象的工作;由于需求的變化腋寨,需要?jiǎng)?chuàng)建的對(duì)象的具體類(lèi)型經(jīng)常變化.
  • 如何應(yīng)對(duì)這種變化?如何繞過(guò)常規(guī)的對(duì)象創(chuàng)建方法(new)聪铺,提供一種“封裝機(jī)制”來(lái)避免客戶(hù)程序和這種“具體對(duì)象創(chuàng)建工作”的緊耦合?
  • 關(guān)鍵方法返回一個(gè)對(duì)象
    非靜態(tài)方法 工廠(chǎng)基類(lèi)

模式定義

  • 定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi).Factory Method 使得一個(gè)類(lèi)的實(shí)例化延遲(目的:解耦,手段:虛函數(shù))到子類(lèi).

要點(diǎn)總結(jié)

  • Factory Method模式用于隔離類(lèi)對(duì)象的使用者和具體類(lèi)型之間的耦合關(guān)系萄窜。面對(duì)一個(gè)經(jīng)常變化的具體類(lèi)型铃剔,緊耦合關(guān)系(new)會(huì)導(dǎo)致軟件的脆弱。
  • Factory Method模式通過(guò)面向?qū)ο蟮氖址?將所要?jiǎng)?chuàng)建的具體對(duì)象工作延遲到子類(lèi)查刻,從而實(shí)現(xiàn)一種擴(kuò)展(而非更改)的策略键兜,較好地解決了這種緊耦合關(guān)系
  • Factory Method模式解決“單個(gè)對(duì)象”的需求變化。缺點(diǎn)在于要求創(chuàng)建方法/參數(shù)相同

Abstract Factory抽象工廠(chǎng)

定義

產(chǎn)品族:位于不同產(chǎn)品等級(jí)結(jié)構(gòu)穗泵,功能相關(guān)聯(lián)的產(chǎn)品組成的家族蝶押。
如圖:


產(chǎn)品族

圖中一共有四個(gè)產(chǎn)品族,分布于三個(gè)不同的產(chǎn)品等級(jí)結(jié)構(gòu)中火欧。只要指明一個(gè)產(chǎn)品所處的產(chǎn)品族以及它所屬的等級(jí)結(jié)構(gòu),就可以唯一的確定這個(gè)產(chǎn)品茎截。

所謂的抽象工廠(chǎng)是指一個(gè)工廠(chǎng)等級(jí)結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對(duì)象苇侵。如果用圖來(lái)描述的話(huà),如下圖:

結(jié)構(gòu)


圖中描述的東西用產(chǎn)品族描述如下


舉例

    //數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)有關(guān)的基類(lèi)
    class IDBConnection{
    
    }
    
    class IDBCommand{
    
    }
    
    class IDataReader{
    
    }
    
    
    abstract class IDBFactory{
        public abstract IDBConnection createDBConnection();
        public abstract IDBCommand createDBCommand();
        public abstract IDataReader createDataReader();
        
    
    }
    
    //支持My SQL
    class MySqlConnection extends IDBConnection{
    
    }
    class MySqlCommand extends IDBCommand{
    
     }
    class MySqlDataReader extends IDataReader{
    
    }
    
    
    class MySqlDBFactory extends IDBFactory{
    
        @Override
        public IDBConnection createDBConnection() {
            return new MySqlConnection();
        }

        @Override
        public IDBCommand createDBCommand() {
            return new MySqlCommand();
        }
    
        @Override
        public IDataReader createDataReader() {
            return new MySqlDataReader();
        }
    
    
     }
    
    //支持Oracle
    class OracleConnection extends IDBConnection{
    
    }
    
    class OracleCommand extends IDBCommand{
    
    }
    
    class OracleDataReader extends IDataReader{
    
    }

    class OracleDBFactory extends IDBFactory{
    
        @Override
        public IDBConnection createDBConnection() {
            return new OracleConnection();
        }

        @Override
        public IDBCommand createDBCommand() {
            return new OracleCommand();
        }
    
        @Override
public IDataReader createDataReader() {
            return new OracleDataReader();
        }
    }
    
    
    class EmployeeDAO{
        IDBFactory dbFactory;
        public Vector<EmployeeDO> getEmployees(){
            IDBConnection connection =dbConnectionFactory.createDBConnection();
            connection.setConnectionString("...");

            IDBCommand command = dbCommandFactory.createDBCommand();
            command.setCommandText("...");
            command.setConnection(connection);//關(guān)聯(lián)性
    
            IDBDataReader reader = command.executeReader();//關(guān)聯(lián)性
            while (reader.read()) {
    
    
            }
    
            return employeeDOs;
        }
    
            
    }

在什么情形下使用抽象工廠(chǎng)模式:

  • 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴(lài)于產(chǎn)品類(lèi)實(shí)例如何被創(chuàng)建企锌、組合和表達(dá)的細(xì)節(jié)榆浓,這對(duì)于所有形態(tài)的工廠(chǎng)模式都是重要的。
  • 這個(gè)系統(tǒng)有多于一個(gè)的產(chǎn)品族撕攒,而系統(tǒng)只消費(fèi)其中某一產(chǎn)品族陡鹃。
  • 同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)抖坪。
  • 系統(tǒng)提供一個(gè)產(chǎn)品類(lèi)的庫(kù)萍鲸,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶(hù)端不依賴(lài)于實(shí)現(xiàn)擦俐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脊阴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘿期,老刑警劉巖品擎,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異备徐,居然都是意外死亡萄传,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蜜猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秀菱,“玉大人,你說(shuō)我怎么就攤上這事瓣铣〈鹋螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵棠笑,是天一觀(guān)的道長(zhǎng)梦碗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蓖救,這世上最難降的妖魔是什么洪规? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮循捺,結(jié)果婚禮上斩例,老公的妹妹穿的比我還像新娘。我一直安慰自己从橘,他們只是感情好念赶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恰力,像睡著了一般叉谜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踩萎,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天停局,我揣著相機(jī)與錄音,去河邊找鬼香府。 笑死董栽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的企孩。 我是一名探鬼主播锭碳,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柠硕!你這毒婦竟也來(lái)了工禾?” 一聲冷哼從身側(cè)響起运提,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闻葵,沒(méi)想到半個(gè)月后民泵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槽畔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年栈妆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厢钧。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳞尔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出早直,到底是詐尸還是另有隱情寥假,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布霞扬,位于F島的核電站糕韧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏喻圃。R本人自食惡果不足惜萤彩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斧拍。 院中可真熱鬧雀扶,春花似錦、人聲如沸肆汹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昂勉。三九已至转绷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硼啤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工斧账, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谴返,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓咧织,卻偏偏與公主長(zhǎng)得像嗓袱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子习绢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一渠抹、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用蝙昙、多...
    MinoyJet閱讀 3,949評(píng)論 1 15
  • 夜幕漸濃奇颠,老海拖著一身疲憊,穿過(guò)一長(zhǎng)串暈紅的燈光放航,推開(kāi)小院?jiǎn)紊辱F門(mén)烈拒。 這座院落年代久遠(yuǎn),青磚灰瓦广鳍,花格墁地荆几。院子一...
    邑之牛閱讀 552評(píng)論 1 2
  • Ellen ED, Peeters K, Verhoeven M, Gols R, Harvey JA, Wade...
    董八七閱讀 731評(píng)論 0 0