亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

CloudwiseAPM / 746人閱讀

摘要:維基百科有對這類模式的定義在軟件工程中,創(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

相關(guān)文章

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

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

    wind3110991 評論0 收藏0
  • 前端設(shè)計模式

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

    newsning 評論0 收藏0
  • JS 建造模式

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

    channg 評論0 收藏0
  • 超全的設(shè)計模式簡介(45種)

    摘要:設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計模式的類型共有種設(shè)計模式。工廠模式工廠模式最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計模式簡介(45種) design-patterns-for-humans 中文版...

    wdzgege 評論0 收藏0
  • 超全的設(shè)計模式簡介(45種)

    摘要:設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計模式的類型共有種設(shè)計模式。工廠模式工廠模式最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 該文建議配合 design-patterns-for-humans 中文版 一起看。 推薦閱讀 超全的設(shè)計模式簡介(45種) design-patterns-for-humans 中文版...

    Betta 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<