設(shè)計(jì)模式1(創(chuàng)建型)

類設(shè)計(jì)考慮的問(wèn)題

1.類的組織與表示

聚類分析、類的再抽象涮俄、類的拆分、類的復(fù)用性... ...

2.行為的組織與表示

行為的分解、行為的參與者合搅、行為的分組與接口兢哭、行為的差異... ...

3.屬性的組織與表示

復(fù)合屬性不铆、只讀只寫(xiě)屬性暂题、不變屬性、運(yùn)行時(shí)屬性... ...

變化與復(fù)用

1.變化

職責(zé)的變化(接口喜喂、功能)

實(shí)現(xiàn)的變化(數(shù)據(jù)表示瓤摧、行為)

2.變化的適應(yīng)方式

擴(kuò)展既有代碼:繼承、關(guān)聯(lián)玉吁、依賴照弥、聚合、組合

直接修改代碼的問(wèn)題:獲取既有代碼进副、改變實(shí)現(xiàn)的顧慮这揣、改變接口的顧慮

設(shè)計(jì)模式基本原則

抽象與封裝原則:

分離穩(wěn)定與變化

封裝變化

抽象變化接口

針對(duì)接口編程而不針對(duì)實(shí)現(xiàn)編程

組合優(yōu)先原則(而不是繼承)


類的關(guān)系

class A{

public:

void f();

}

關(guān)聯(lián)

class B{

public:

void g();

private:

A*pa;

}

單向關(guān)聯(lián)

依賴(實(shí)例級(jí)關(guān)聯(lián))

class B{

public:

void g(A&a){ a.f()};

}

依賴

組合/聚合(類級(jí)關(guān)聯(lián))

class B{

public:

void g();

private:

A*pA;

}


組合


聚合

泛化關(guān)系

泛化

實(shí)現(xiàn)關(guān)系


實(shí)現(xiàn)關(guān)系


設(shè)計(jì)模式3大類

創(chuàng)建型設(shè)計(jì)模式-工廠方法模式

動(dòng)機(jī):

顧客Client類與產(chǎn)品耦合緊密,

產(chǎn)品經(jīng)常變化(增加,添加屬性)


class Client(){

void f(){

Dog*d=new Dog;

}

}


//使用IAnimal接口

class Client(){

void f(){

IAnimal*ani=new Dog;

}

}


//工廠方法1-分離實(shí)例化部分

class Client(){

void f(){

IAnimal*ani=CreateAnimal();

}

virtual IAnimal*CreateAnimal();//工廠方法

}


//工廠方法2-分離實(shí)例化部分

class Client(){

void f(Factory&fac){

IAnimal*ani=fac.CreateAnimal();

}

}

//獨(dú)立出工廠

class Factory{

virtual IAnimal*CreateAnimal();

}


工廠方法

總結(jié)

定義頂層工廠接口给赞,由接口決定產(chǎn)品的創(chuàng)建

優(yōu)點(diǎn):

擴(kuò)展產(chǎn)品支持開(kāi)閉原則(擴(kuò)展開(kāi)發(fā)机打,修改關(guān)閉):新增產(chǎn)品樹(shù)、類片迅;用同構(gòu)產(chǎn)品樹(shù)替換原產(chǎn)品樹(shù)

不足:

繼承導(dǎo)致:子類數(shù)量過(guò)多

創(chuàng)建型設(shè)計(jì)模式-簡(jiǎn)單工廠(靜態(tài)工廠)方法模式

和工廠方法的區(qū)別:

如果產(chǎn)品種類穩(wěn)定残邀,則從Factory派生子類失去意義,所以Factory中的方法成為類方法將更加合理


在實(shí)例化對(duì)象時(shí)柑蛇,如果輸入條件(參數(shù))不一樣罐旗,產(chǎn)生的對(duì)象也不一樣,那么我們可以考慮使用簡(jiǎn)單工廠對(duì)不同的實(shí)例進(jìn)行統(tǒng)一封裝唯蝶。

創(chuàng)建型設(shè)計(jì)模式-單件模式

動(dòng)機(jī):

僅有一個(gè)實(shí)例或至多有N個(gè)實(shí)例

能夠從外部訪問(wèn)它

即程序在運(yùn)行的過(guò)程中,希望在任意時(shí)刻遗嗽,都只保留某個(gè)對(duì)象的唯一實(shí)例

class single{

public:

?static single*instance();

?void f();?

private:

?single(){...}

?single(const single&);//禁用

?single&operator=(const single&);

private:

?static single*instance;

}


single*single::instance=0;

single*single::instance(){

?if(instance==0){

?instance=new instance;

?}

?return instance;

}

創(chuàng)建型設(shè)計(jì)模式-構(gòu)造器/生成器模式

動(dòng)機(jī):

創(chuàng)建復(fù)雜對(duì)象

創(chuàng)建復(fù)雜對(duì)象1
創(chuàng)建復(fù)雜對(duì)象2

陳老師的創(chuàng)建墻的例子:

當(dāng)創(chuàng)建墻的時(shí)候粘我,需要?jiǎng)?chuàng)建水泥和磚

采用工廠方法去創(chuàng)建,工廠方法里面包括了:創(chuàng)建水泥和創(chuàng)建磚方法

通過(guò)調(diào)用

factory.創(chuàng)建水泥();

factory.創(chuàng)建磚();

factory.創(chuàng)建水泥();

factory.創(chuàng)建磚();

創(chuàng)建墻

問(wèn)題:在創(chuàng)建墻的過(guò)程中痹换,水泥和磚的創(chuàng)建次數(shù)是不需要知道的

采用工廠方法

墻構(gòu)造器.創(chuàng)建磚(5){

?循環(huán)5次factory.創(chuàng)建磚();

}

墻構(gòu)造器.創(chuàng)建水泥(5){

循環(huán)5次factory.創(chuàng)建水泥();

}

如果需要適應(yīng)更多的變化征字,比如構(gòu)造一層磚,則可以再抽象 出一個(gè)類



盜來(lái)的時(shí)序圖

在創(chuàng)建時(shí)娇豫,先生成一個(gè)墻的Builder類匙姜,然后在Director指示器的方法中,選擇要?jiǎng)?chuàng)建的行為冯痢,該行為調(diào)用Builder中的創(chuàng)建方法氮昧,最后返回創(chuàng)建完畢的墻。


使用相同的產(chǎn)品但使用不同的構(gòu)造器浦楣,可以產(chǎn)生不同的復(fù)雜對(duì)象袖肥。

構(gòu)造器隱藏了構(gòu)建的細(xì)節(jié)和裝配的過(guò)程

創(chuàng)建型設(shè)計(jì)模式-原型方法

動(dòng)機(jī):

當(dāng)我們需要?jiǎng)?chuàng)建多次/多個(gè),相同的元素時(shí)振劳。

我們?cè)诔绦蜻\(yùn)行過(guò)程中椎组,當(dāng)需要有新的實(shí)例對(duì)象(但是狀態(tài)基本相同的元素)時(shí)使用。

例子:我的世界中历恐,草坪塊寸癌,變成有積雪覆蓋的草坪塊。

這個(gè)時(shí)候就需要一個(gè)新的圖塊對(duì)象覆蓋原本的塊弱贼。

不同的解決方案:

1.使用構(gòu)造函數(shù)

屬于硬編碼蒸苇,不能動(dòng)態(tài)改變創(chuàng)建的類

2.拷貝/構(gòu)造函數(shù)

new 沙塊(a沙塊);

new 巖石(a巖石)哮洽;

需要知道確切的類型

原型方法:


class BlockManager(){

?private:

?static Sand* aSand;

?static Rock* aRock;

public:

?Block*Create(int id){

? ?if(id==1){return aSand.clone();}

? ?else if(id==2){return aRock.clone();}

?}

}

原型方法可以有效減少子類的數(shù)量填渠,但是事先clone接口可能存在難度。

創(chuàng)建型設(shè)計(jì)模式-抽象工廠方法


有兩個(gè)產(chǎn)品樹(shù)的工廠方法

動(dòng)機(jī):

如上圖,當(dāng)需要限制氛什,喜歡貓的小孩只能創(chuàng)建貓莺葫。

限制用戶使用同一系列的產(chǎn)品。

(window操作系統(tǒng)下面枪眉,只能使用window下面的鼠標(biāo)捺檬、窗口事件)

進(jìn)一步抽象:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贸铜,隨后出現(xiàn)的幾起案子堡纬,更是在濱河造成了極大的恐慌,老刑警劉巖蒿秦,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烤镐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棍鳖,警方通過(guò)查閱死者的電腦和手機(jī)炮叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渡处,“玉大人镜悉,你說(shuō)我怎么就攤上這事∫教保” “怎么了侣肄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)醇份。 經(jīng)常有香客問(wèn)我稼锅,道長(zhǎng),這世上最難降的妖魔是什么僚纷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任缰贝,我火速辦了婚禮,結(jié)果婚禮上畔濒,老公的妹妹穿的比我還像新娘剩晴。我一直安慰自己,他們只是感情好侵状,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赞弥。 她就那樣靜靜地躺著,像睡著了一般趣兄。 火紅的嫁衣襯著肌膚如雪绽左。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天艇潭,我揣著相機(jī)與錄音拼窥,去河邊找鬼戏蔑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲁纠,可吹牛的內(nèi)容都是我干的总棵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼改含,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼情龄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捍壤,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骤视,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鹃觉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體专酗,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盗扇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笼裳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粱玲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拜轨,到底是詐尸還是另有隱情抽减,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布橄碾,位于F島的核電站卵沉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏法牲。R本人自食惡果不足惜史汗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒垃。 院中可真熱鬧停撞,春花似錦、人聲如沸悼瓮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)横堡。三九已至埋市,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間命贴,已是汗流浹背道宅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工食听, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人污茵。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓樱报,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親省咨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肃弟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)零蓉,斷路器笤受,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 工作時(shí)間一長(zhǎng),需求多而雜敌蜂,往往難得有時(shí)間去仔細(xì)思量代碼如何寫(xiě)的更加優(yōu)雅箩兽,習(xí)慣使然。設(shè)計(jì)模式本身不是一個(gè)神秘的東西章喉,...
    __七把刀__閱讀 1,281評(píng)論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法汗贫,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法秸脱,繼承相關(guān)的語(yǔ)法落包,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • 1 場(chǎng)景問(wèn)題# 大家都知道摊唇,在Java應(yīng)用開(kāi)發(fā)中咐蝇,要“面向接口編程”。那么什么是接口巷查?接口有什么作用有序?接口如何使用...
    七寸知架構(gòu)閱讀 6,420評(píng)論 14 70