摘要:維基百科有對(duì)這類模式的定義在軟件工程中,創(chuàng)建型模式是處理對(duì)象對(duì)象計(jì)算機(jī)科學(xué)創(chuàng)建的設(shè)計(jì)模式設(shè)計(jì)模式計(jì)算機(jī),試圖根據(jù)實(shí)際情況使用合適的方式創(chuàng)建對(duì)象。接下來本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式建造者模式和原型模式,文中的代碼已托管在上。
前言
前兩篇文章介紹了單例模式和工廠模式,這兩種設(shè)計(jì)模式實(shí)際上都屬于軟件工程中的創(chuàng)建型模式(Creational Pattern)。維基百科有對(duì)這類模式的定義:
在軟件工程中,創(chuàng)建型模式 是處理對(duì)象 "對(duì)象 (計(jì)算機(jī)科學(xué))")創(chuàng)建的設(shè)計(jì)模式 "設(shè)計(jì)模式 (計(jì)算機(jī))"),試圖根據(jù)實(shí)際情況使用合適的方式創(chuàng)建對(duì)象。基本的對(duì)象創(chuàng)建方式可能會(huì)導(dǎo)致設(shè)計(jì)上的問題,或增加設(shè)計(jì)的復(fù)雜度。創(chuàng)建型模式通過以某種方式控制對(duì)象的創(chuàng)建來解決問題。
創(chuàng)建型模式由兩個(gè)主導(dǎo)思想構(gòu)成。一是將系統(tǒng)使用的具體類封裝起來,二是隱藏這些具體類的實(shí)例創(chuàng)建和結(jié)合的方式。
實(shí)際上創(chuàng)建型模式的最大作用就是把對(duì)象的創(chuàng)建過程和使用過程進(jìn)行了解耦,對(duì)使用者只提供接口而隱藏了具體的實(shí)現(xiàn)細(xì)節(jié),讓軟件結(jié)構(gòu)更清晰,更符合單一職責(zé)的原則。接下來本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式——建造者模式和原型模式,文中的代碼已托管在Github上。
建造者模式建造者模式(Builder Pattern)與工廠模式類似,也是把產(chǎn)品的實(shí)例化過程交給專門的類來實(shí)現(xiàn),不同的是建造者模式更多的是針對(duì)現(xiàn)實(shí)中一些構(gòu)成較復(fù)雜,有多個(gè)組成部分的對(duì)象。比如像汽車就由車身、發(fā)動(dòng)機(jī)、車輪、方向盤等很多部件組成,而且整個(gè)組裝的過程可能還要安裝一定的順序進(jìn)行。
class Car(object): """產(chǎn)品 """ def __init__(self, name): self.name = name self.body = None self.engine = None self.tire = None def __str__(self): info = ("Name: {}".format(self.name), "Body: {}".format(self.body), "Engine: {}".format(self.engine), "Tire: {}".format(self.tire)) return " ".join(info)
但是在現(xiàn)實(shí)使用時(shí),用戶可能并不關(guān)心汽車的這些細(xì)節(jié)和如何將這些部件組裝成汽車的,而只是想通過特定的接口和參數(shù)獲得汽車這個(gè)對(duì)象。這時(shí)就需要將這個(gè)復(fù)雜的過程抽象到到一個(gè)被稱作建造者的對(duì)象里,建造者來負(fù)責(zé)構(gòu)造這些復(fù)雜的組成:
class CarBuilder(object): """建造者 """ def __init__(self): self.car = Car("Mercedes") def add_body(self, body): self.car.body = body def add_engine(self, engine): """AMG 5.5L V8 biturbo""" self.car.engine = engine def add_tire(self, tire): self.car.tire = tire def assemble_car(self): return self.car
最后建造者模式中還會(huì)引入了一個(gè)指揮者類的角色,該類的作用主要是負(fù)責(zé)精確地控制產(chǎn)品的整個(gè)生成過程,根據(jù)用戶的不同需求返回不同的完整產(chǎn)品對(duì)象。
class Engineer(object): """指揮者 """ def __init__(self): self.builder = None def construct_car(self, body, engine, tire): self.builder = CarBuilder() self.builder.add_body(body) self.builder.add_engine(engine) self.builder.add_tire(tire) return self.builder.assemble_car()
只要把需求告訴指揮者,用戶就可以獲得一個(gè)產(chǎn)品的實(shí)例,如下所示:
engineer = Engineer() car = engineer.construct_car( body="G63", engine="AMG 5.5L V8 biturbo", tire="Michelin 18inch") print(car) # Output >Name: Mercedes >Body: G63 >Engine: AMG 5.5L V8 biturbo >Tire: Michelin 18inch原型模式
原型模式(Prototype design pattern)的動(dòng)機(jī)是為了讓用戶可以通過復(fù)制對(duì)象獲得一個(gè)對(duì)象的副本。此模式的出現(xiàn)是因?yàn)樵贑++和Java里需要用此模式來更方便的拷貝對(duì)象,但在Python中要實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的拷貝有更簡(jiǎn)單辦法,我們就在這里簡(jiǎn)單的舉個(gè)例子:
#coding=utf-8 class Foo(object): def __init__(self, x, y): self.x = x self.y = y def __str__(self): return "id: {}, x: {}, y: {}".format(id(self), self.x, self.y) if __name__ == "__main__": foo = Foo(1, 2) # 利用deepcopy獲得新對(duì)象 import copy foo1 = copy.deepcopy(foo) foo1.x = 3 foo1.y = 4 print(foo, foo1) # 利用__class__方法獲得新 foo2 = foo1.__class__(5, 6) print(foo, foo2) # Output >id: 4312696592, x: 1, y: 2 id: 4312696928, x: 3, y: 4 >id: 4312696592, x: 1, y: 2 id: 4312697096, x: 5, y: 6
上面我們用兩種原型方式實(shí)現(xiàn)了對(duì)Foo對(duì)象的拷貝,第一種是利用Python語言內(nèi)置的deepcopy,第二種則用了更優(yōu)雅的__class__方法。
結(jié)論本文介紹的兩種模式在實(shí)際使用中并不常見,建造者模式應(yīng)用在構(gòu)造一些復(fù)雜的對(duì)象時(shí),比如需要構(gòu)建一個(gè)HTML對(duì)象,窗口對(duì)象或者游戲中的建模等等,而原型模式則主要應(yīng)用于一些需要備份狀態(tài)的對(duì)象或新建對(duì)象開銷過大的時(shí)候。
參考[1]維基百科
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/41333.html
摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動(dòng)力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計(jì)模式。為我們提供了建造者模式的快速實(shí)現(xiàn),要應(yīng)用到實(shí)際編碼中。 ...
摘要:作為一個(gè)前端新人,學(xué)習(xí)了設(shè)計(jì)模式以后,希望能從源頭上,用淺顯易懂的語言來解釋它。創(chuàng)建型設(shè)計(jì)模式創(chuàng)建型設(shè)計(jì)模式故名思意,這些模式都是用來創(chuàng)建實(shí)例對(duì)象的。這就是簡(jiǎn)單工廠模式。這就是工廠方法模式。 作為一個(gè)前端新人,學(xué)習(xí)了設(shè)計(jì)模式以后,希望能從源頭上,用淺顯易懂的語言來解釋它。當(dāng)然不一定是正確的,只是我個(gè)人對(duì)設(shè)計(jì)模式的一點(diǎn)淺顯理解。 創(chuàng)建型設(shè)計(jì)模式 創(chuàng)建型設(shè)計(jì)模式:故名思意,這些模式都是用來...
摘要:如何應(yīng)對(duì)這種變化如何提供一種封裝機(jī)制來隔離出復(fù)雜對(duì)象的各個(gè)部分的變化,從而保持系統(tǒng)中的穩(wěn)定構(gòu)建算法不隨著需求改變而改變這就是要說的建造者模式。建造者模式,將一個(gè)復(fù)雜對(duì)象的構(gòu)建層與其表示層相互分離,使得同樣的構(gòu)建過程可以采用不同的表示。 1. 簡(jiǎn)介 在軟件系統(tǒng)中,有時(shí)候面臨著一個(gè)復(fù)雜對(duì)象的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著...
摘要:設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計(jì)模式的類型共有種設(shè)計(jì)模式。工廠模式工廠模式最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計(jì)模式簡(jiǎn)介(45種) design-patterns-for-humans 中文版...
摘要:設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計(jì)模式的類型共有種設(shè)計(jì)模式。工廠模式工廠模式最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計(jì)模式簡(jiǎn)介(45種) design-patterns-for-humans 中文版...
閱讀 664·2021-11-15 11:39
閱讀 2901·2021-10-08 10:04
閱讀 3265·2019-08-30 10:57
閱讀 3026·2019-08-26 13:25
閱讀 1908·2019-08-26 12:14
閱讀 2637·2019-08-23 15:27
閱讀 2996·2019-08-23 15:18
閱讀 1778·2019-08-23 14:26