成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Python實(shí)現(xiàn)設(shè)計(jì)模式——建造者模式和原型模式

CloudwiseAPM / 710人閱讀

摘要:維基百科有對(duì)這類模式的定義在軟件工程中,創(chuàng)建型模式是處理對(duì)象對(duì)象計(jì)算機(jī)科學(xué)創(chuàng)建的設(shè)計(jì)模式設(shè)計(jì)模式計(jì)算機(jī),試圖根據(jù)實(shí)際情況使用合適的方式創(chuàng)建對(duì)象。接下來(lái)本文將繼續(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ì)上的問(wèn)題,或增加設(shè)計(jì)的復(fù)雜度。創(chuàng)建型模式通過(guò)以某種方式控制對(duì)象的創(chuàng)建來(lái)解決問(wèn)題。
創(chuàng)建型模式由兩個(gè)主導(dǎo)思想構(gòu)成。一是將系統(tǒng)使用的具體類封裝起來(lái),二是隱藏這些具體類的實(shí)例創(chuàng)建和結(jié)合的方式。

實(shí)際上創(chuàng)建型模式的最大作用就是把對(duì)象的創(chuàng)建過(guò)程和使用過(guò)程進(jìn)行了解耦,對(duì)使用者只提供接口而隱藏了具體的實(shí)現(xiàn)細(xì)節(jié),讓軟件結(jié)構(gòu)更清晰,更符合單一職責(zé)的原則。接下來(lái)本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式——建造者模式和原型模式,文中的代碼已托管在Github上。

建造者模式

建造者模式(Builder Pattern)與工廠模式類似,也是把產(chǎn)品的實(shí)例化過(guò)程交給專門的類來(lái)實(shí)現(xiàn),不同的是建造者模式更多的是針對(duì)現(xiàn)實(shí)中一些構(gòu)成較復(fù)雜,有多個(gè)組成部分的對(duì)象。比如像汽車就由車身、發(fā)動(dòng)機(jī)、車輪、方向盤等很多部件組成,而且整個(gè)組裝的過(guò)程可能還要安裝一定的順序進(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é)和如何將這些部件組裝成汽車的,而只是想通過(guò)特定的接口和參數(shù)獲得汽車這個(gè)對(duì)象。這時(shí)就需要將這個(gè)復(fù)雜的過(guò)程抽象到到一個(gè)被稱作建造者的對(duì)象里,建造者來(lái)負(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è)生成過(guò)程,根據(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ī)是為了讓用戶可以通過(guò)復(fù)制對(duì)象獲得一個(gè)對(duì)象的副本。此模式的出現(xiàn)是因?yàn)樵贑++和Java里需要用此模式來(lái)更方便的拷貝對(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語(yǔ)言內(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ì)象開銷過(guò)大的時(shí)候。

參考

[1]維基百科

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41333.html

相關(guān)文章

  • 《源碼中的設(shè)計(jì)模式》之建造模式——鏈?zhǔn)秸{(diào)

    摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動(dòng)力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計(jì)模式。為我們提供了建造者模式的快速實(shí)現(xiàn),要應(yīng)用到實(shí)際編碼中。 ...

    wind3110991 評(píng)論0 收藏0
  • 前端設(shè)計(jì)模式

    摘要:作為一個(gè)前端新人,學(xué)習(xí)了設(shè)計(jì)模式以后,希望能從源頭上,用淺顯易懂的語(yǔ)言來(lái)解釋它。創(chuàng)建型設(shè)計(jì)模式創(chuàng)建型設(shè)計(jì)模式故名思意,這些模式都是用來(lái)創(chuàng)建實(shí)例對(duì)象的。這就是簡(jiǎn)單工廠模式。這就是工廠方法模式。 作為一個(gè)前端新人,學(xué)習(xí)了設(shè)計(jì)模式以后,希望能從源頭上,用淺顯易懂的語(yǔ)言來(lái)解釋它。當(dāng)然不一定是正確的,只是我個(gè)人對(duì)設(shè)計(jì)模式的一點(diǎn)淺顯理解。 創(chuàng)建型設(shè)計(jì)模式 創(chuàng)建型設(shè)計(jì)模式:故名思意,這些模式都是用來(lái)...

    newsning 評(píng)論0 收藏0
  • JS 建造模式

    摘要:如何應(yīng)對(duì)這種變化如何提供一種封裝機(jī)制來(lái)隔離出復(fù)雜對(duì)象的各個(gè)部分的變化,從而保持系統(tǒng)中的穩(wěn)定構(gòu)建算法不隨著需求改變而改變這就是要說(shuō)的建造者模式。建造者模式,將一個(gè)復(fù)雜對(duì)象的構(gòu)建層與其表示層相互分離,使得同樣的構(gòu)建過(guò)程可以采用不同的表示。 1. 簡(jiǎn)介 在軟件系統(tǒng)中,有時(shí)候面臨著一個(gè)復(fù)雜對(duì)象的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著...

    channg 評(píng)論0 收藏0
  • 超全的設(shè)計(jì)模式簡(jiǎn)介(45種)

    摘要:設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。設(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 中文版...

    wdzgege 評(píng)論0 收藏0
  • 超全的設(shè)計(jì)模式簡(jiǎn)介(45種)

    摘要:設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。設(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 中文版...

    Betta 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<