国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

CloudwiseAPM / 692人閱讀

摘要:維基百科有對(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

相關(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ì)模式以后,希望能從源頭上,用淺顯易懂的語言來解釋它。創(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ì)模式:故名思意,這些模式都是用來...

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

    摘要:如何應(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)常面臨著...

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

    摘要:設(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 中文版...

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

    摘要:設(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 中文版...

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

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

0條評(píng)論

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