摘要:維基百科有對這類模式的定義在軟件工程中,創(chuàng)建型模式是處理對象對象計算機科學(xué)創(chuàng)建的設(shè)計模式設(shè)計模式計算機,試圖根據(jù)實際情況使用合適的方式創(chuàng)建對象。接下來本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式建造者模式和原型模式,文中的代碼已托管在上。
前言
前兩篇文章介紹了單例模式和工廠模式,這兩種設(shè)計模式實際上都屬于軟件工程中的創(chuàng)建型模式(Creational Pattern)。維基百科有對這類模式的定義:
在軟件工程中,創(chuàng)建型模式 是處理對象 "對象 (計算機科學(xué))")創(chuàng)建的設(shè)計模式 "設(shè)計模式 (計算機)"),試圖根據(jù)實際情況使用合適的方式創(chuàng)建對象?;镜膶ο髣?chuàng)建方式可能會導(dǎo)致設(shè)計上的問題,或增加設(shè)計的復(fù)雜度。創(chuàng)建型模式通過以某種方式控制對象的創(chuàng)建來解決問題。
創(chuàng)建型模式由兩個主導(dǎo)思想構(gòu)成。一是將系統(tǒng)使用的具體類封裝起來,二是隱藏這些具體類的實例創(chuàng)建和結(jié)合的方式。
實際上創(chuàng)建型模式的最大作用就是把對象的創(chuàng)建過程和使用過程進行了解耦,對使用者只提供接口而隱藏了具體的實現(xiàn)細節(jié),讓軟件結(jié)構(gòu)更清晰,更符合單一職責(zé)的原則。接下來本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式——建造者模式和原型模式,文中的代碼已托管在Github上。
建造者模式建造者模式(Builder Pattern)與工廠模式類似,也是把產(chǎn)品的實例化過程交給專門的類來實現(xiàn),不同的是建造者模式更多的是針對現(xiàn)實中一些構(gòu)成較復(fù)雜,有多個組成部分的對象。比如像汽車就由車身、發(fā)動機、車輪、方向盤等很多部件組成,而且整個組裝的過程可能還要安裝一定的順序進行。
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)實使用時,用戶可能并不關(guān)心汽車的這些細節(jié)和如何將這些部件組裝成汽車的,而只是想通過特定的接口和參數(shù)獲得汽車這個對象。這時就需要將這個復(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
最后建造者模式中還會引入了一個指揮者類的角色,該類的作用主要是負責(zé)精確地控制產(chǎn)品的整個生成過程,根據(jù)用戶的不同需求返回不同的完整產(chǎn)品對象。
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()
只要把需求告訴指揮者,用戶就可以獲得一個產(chǎn)品的實例,如下所示:
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)的動機是為了讓用戶可以通過復(fù)制對象獲得一個對象的副本。此模式的出現(xiàn)是因為在C++和Java里需要用此模式來更方便的拷貝對象,但在Python中要實現(xiàn)對一個對象的拷貝有更簡單辦法,我們就在這里簡單的舉個例子:
#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獲得新對象 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
上面我們用兩種原型方式實現(xiàn)了對Foo對象的拷貝,第一種是利用Python語言內(nèi)置的deepcopy,第二種則用了更優(yōu)雅的__class__方法。
結(jié)論本文介紹的兩種模式在實際使用中并不常見,建造者模式應(yīng)用在構(gòu)造一些復(fù)雜的對象時,比如需要構(gòu)建一個HTML對象,窗口對象或者游戲中的建模等等,而原型模式則主要應(yīng)用于一些需要備份狀態(tài)的對象或新建對象開銷過大的時候。
參考[1]維基百科
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/41333.html
摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計模式。為我們提供了建造者模式的快速實現(xiàn),要應(yīng)用到實際編碼中。 ...
摘要:作為一個前端新人,學(xué)習(xí)了設(shè)計模式以后,希望能從源頭上,用淺顯易懂的語言來解釋它。創(chuàng)建型設(shè)計模式創(chuàng)建型設(shè)計模式故名思意,這些模式都是用來創(chuàng)建實例對象的。這就是簡單工廠模式。這就是工廠方法模式。 作為一個前端新人,學(xué)習(xí)了設(shè)計模式以后,希望能從源頭上,用淺顯易懂的語言來解釋它。當(dāng)然不一定是正確的,只是我個人對設(shè)計模式的一點淺顯理解。 創(chuàng)建型設(shè)計模式 創(chuàng)建型設(shè)計模式:故名思意,這些模式都是用來...
摘要:設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計模式的類型共有種設(shè)計模式。工廠模式工廠模式最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計模式簡介(45種) design-patterns-for-humans 中文版...
摘要:設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計模式的類型共有種設(shè)計模式。工廠模式工廠模式最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計模式簡介(45種) design-patterns-for-humans 中文版...
閱讀 751·2021-11-15 11:39
閱讀 2993·2021-10-08 10:04
閱讀 3374·2019-08-30 10:57
閱讀 3101·2019-08-26 13:25
閱讀 1978·2019-08-26 12:14
閱讀 2726·2019-08-23 15:27
閱讀 3087·2019-08-23 15:18
閱讀 1865·2019-08-23 14:26