亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Python語言中的工廠方法模式初探

        2014-12-31 00:00:00林中鴻
        電子世界 2014年20期

        【摘要】Python是一種使用率比較高的,完全面向?qū)ο蟮膭討B(tài)語言。本文嘗試使用Python語言來實現(xiàn)工廠方法設(shè)計模式。

        【關(guān)鍵詞】Python;設(shè)計模式;工廠方法

        設(shè)計模式是一個抽象層次,描述了在一個特定的環(huán)境中用來解決一般設(shè)計問題的對象和類之間的交互關(guān)系,其主要目的是充分利用語言的特性,設(shè)計可復用的、能夠適應需求變更的軟件。Python是一種完全面向?qū)ο蟮膭討B(tài)語言,提供了與傳統(tǒng)面向?qū)ο笳Z言截然不同的對象模型,影響了設(shè)計模式的實現(xiàn)和使用。Python中類也是對象,類和類的對象都有 可供操作的特殊屬性,在運行時還可以修改類的結(jié)構(gòu)和定義,這些特性使Python具有強大的“內(nèi)省”能力,利用這種能力程序員可以創(chuàng)建高級的、動態(tài)的和靈活的應用程序,可以更容易實現(xiàn)設(shè)計模式。

        工廠方法(Factory Method)模式又稱為虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式。在工廠方法模式中,父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類來決定究竟應該實體化哪一個類。

        簡單說來,工廠方法模式的作用就是可以根據(jù)不同的條件生成各種類的實例,這些實例通常屬于多個相似的類型,并且具有共同的父類。工廠方法模式將這些實例的創(chuàng)建過程封裝了起來,從而簡化了客戶程序的編寫,并改善了軟件體系結(jié)構(gòu)的可擴展性,使得將來能夠以最小的代價加入新的子類。

        需要說明的是,使用工廠方法模式創(chuàng)建對象并不意味著一定會讓代碼變得更短(實事上往往更長),并且可能需要設(shè)計更多的輔助類,但它的確可以靈活地、有彈性地創(chuàng)建尚未確定的對象,從而簡化了客戶端應用程序的邏輯結(jié)構(gòu),并提高了代碼的可讀性和可重用性。

        參考GoF的設(shè)計模式一書,對書中實現(xiàn)迷宮工廠的C++代碼用Python實現(xiàn)如下:

        1.class MazeFactory:

        2.def MakeMaze(self):

        3.return Maze()

        4.def MakeWall(self):

        5.return Wall()

        6.def MakeRoom(self, n):

        7.return Room(n)

        8.def MakeDoor(self, r1, r2):

        9.return Door(r1, r2)

        上述代碼定義了一個可以創(chuàng)建Maze、Wall、Room和Door的MazeFactory接口,接下來創(chuàng)建一個魔法迷宮工廠 EnchantedFactory,EnchantedFactory繼承于MazeFactory,并通過MakeRoom和MakeDoor接口創(chuàng)建了具有富有個性的EnchantedRoom和EnchantedDoor。 \u2028

        1.class EnchantedFactory(MazeFactory):

        2.def MakeRoom(self, n):

        3.return EnchantedRoom(n)

        4.def MakeDoor(self, r1, r2):

        5.return EnchantedDoor(r1, r2)

        這段代碼只是對C++代碼的簡單翻譯,沒有運用Python的語言特色。從上述的代碼中可以看出,抽象工廠難以向MazeFactory中添加新的產(chǎn)品,假如迷宮中還需要創(chuàng)建陷阱(Trap),就必須在MazeFactory接口中增加MakeTrap方法,這樣就造成了MazeFactory接口的不穩(wěn)定,繼承 MazeFactory的所有子類的接口也隨著基類的接口改變而改變。

        工廠方法(Factory Method)解決了通過引入一個的Make操作將創(chuàng)建所有產(chǎn)品類型的操作統(tǒng)一化,Make操作中有一個參數(shù)可以唯一標識創(chuàng)建對象的類型。然而,用C++語言實現(xiàn)的工廠方法仍然存在局限性,這種局限性不利于構(gòu)建可復用的軟件。因為創(chuàng)建所有的產(chǎn)品類型都是通過Make接口的,為了保持Make接口的返回值對 所有產(chǎn)品的兼容性,就不得不迫使所有產(chǎn)品類型必須繼承于一個公共的基類,然后Make接口返回該基類,這樣保證了Make返回的類型都可以轉(zhuǎn)換成特定的產(chǎn)品類型。但是,同一系列不同類型的產(chǎn)品在邏輯上可能不存在明確的公共基類,比如MazeFactory中的Maze和Wall,而且,使用公共基類導致了大量的向下強制轉(zhuǎn)換,這種轉(zhuǎn)換往往是不安全的,有時還不可行。Pyhon語言的動態(tài)類型特性為解決該問題提供良好的方案,Python允許一個變量在運行時綁定到不同類型的對象上,所以不必要求不同類型的產(chǎn)品具有公共基類,Make接口不必聲明其返回類型,調(diào)用時具體的返回值類型在運行時交給解釋器去完成。Python實現(xiàn)工廠方法的代碼如下:

        1.class Maze:…

        2.class Wall:…

        3.…

        4.class MazeFactory(object):

        5.def make(self, typename, *args):

        6.if typename == 'maze': return Maze()

        7.elif typename == 'wall': return Wall()

        8.elif typename == 'room':

        9.return Room(args[0])

        10.elif typename == 'door': ]

        11.return Door(args[0], args[1])

        self是MazeFactory實例對象的引用參數(shù),typename標識創(chuàng)建對象的類型,*args是創(chuàng)建具體對象時所需的參數(shù)列表。魔法迷宮的代碼:

        1.class EnchantedFactory(MazeFactory):

        2.def make(self, typename, *args):

        3.if typename == 'room': return EnchantedRoom(args[0] )

        4.elif typename == 'door': return EnchantedDoor(args[0],args[1])

        5.else: return super(EnchantedFactory, self).make(typename, args)

        make方法中的return super(EnchantedFactory, self).make(typename, args)表示調(diào)用父類的操作創(chuàng)建其它類型的對象。

        那么創(chuàng)建一個具體的EnchantedFactory實例的代碼:

        1.mf = EnchantedFactory()

        2.mz = mf.make('maze')

        3.r1 = mf.make('room', 1)

        4.r2 = mf.make('room', 2)

        5.dr = mf.make('door', r1, r2)

        當需要在MazeFactory添加一個Trap新類型時,只需要在Make方法中添加標示新類型的參數(shù)即可:

        elif typename == “trap”: return Trap()

        這種做法不但保持了MazeFactory對外接口的穩(wěn)定性,而且不需要類型的向下轉(zhuǎn)換。

        參考文獻

        [1]程杰著.大話設(shè)計模式[M].清華大學出版社,2007,12.

        [2]Erich Gamma,Richard Helm,Ralph Johnson,John Vissides著,李英軍,馬曉星,蔡敏,劉建中等譯.設(shè)計模式:可利用面向?qū)ο筌浖幕A(chǔ)[M].機械工業(yè)出版社,2010,7.

        作者簡介:林中鴻(1975—),寧夏中衛(wèi)人,講師,研究方向:計算機網(wǎng)絡、程序設(shè)計。

        精品人妻日韩中文字幕| 成年人黄视频大全| 天天中文字幕av天天爽| 国产在线观看黄片视频免费| 亚洲av成人片色在线观看| 亚洲av日韩专区在线观看| 国精品无码一区二区三区在线看| 日韩精品一级在线视频| 美女露出自己的性感大胸一尤内衣 | 国语自产啪在线观看对白| 亚洲国产成人av二区| 免费99精品国产自在在线| 中文字幕久无码免费久久| 中文字幕一区二区三区在线看一区| 在线播放av不卡国产日韩| 国产免费av片在线观看| 国产精品无码无片在线观看3D | 日韩一区二区三区天堂| 少妇一级淫片中文字幕| 东京无码熟妇人妻av在线网址| 中文字幕一区二区三区在线不卡| 日本不卡一区二区三区在线观看| 999国产精品999久久久久久| 国产乱人伦偷精品视频| 99在线无码精品秘 入口九色| 99久久国产精品免费热| 少妇高潮流白浆在线观看| 欧美成人中文字幕| 亚洲第一页在线免费观看| 色婷婷五月综合激情中文字幕| 日韩精品无码av中文无码版| 亚洲成AV人片无码不卡| 国产一区二区黄色的网站| 国内露脸少妇精品视频| 亚洲AV无码成人精品区天堂| 全国一区二区三区女厕偷拍| 女人色熟女乱| 国产精品日韩欧美一区二区区| 亚洲激情一区二区三区视频| 精品视频一区二区三区在线观看| 麻豆精产国品|