999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

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

【摘要】Python是一種使用率比較高的,完全面向對象的動態語言。本文嘗試使用Python語言來實現工廠方法設計模式。

【關鍵詞】Python;設計模式;工廠方法

設計模式是一個抽象層次,描述了在一個特定的環境中用來解決一般設計問題的對象和類之間的交互關系,其主要目的是充分利用語言的特性,設計可復用的、能夠適應需求變更的軟件。Python是一種完全面向對象的動態語言,提供了與傳統面向對象語言截然不同的對象模型,影響了設計模式的實現和使用。Python中類也是對象,類和類的對象都有 可供操作的特殊屬性,在運行時還可以修改類的結構和定義,這些特性使Python具有強大的“內省”能力,利用這種能力程序員可以創建高級的、動態的和靈活的應用程序,可以更容易實現設計模式。

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

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

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

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

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)

上述代碼定義了一個可以創建Maze、Wall、Room和Door的MazeFactory接口,接下來創建一個魔法迷宮工廠 EnchantedFactory,EnchantedFactory繼承于MazeFactory,并通過MakeRoom和MakeDoor接口創建了具有富有個性的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中添加新的產品,假如迷宮中還需要創建陷阱(Trap),就必須在MazeFactory接口中增加MakeTrap方法,這樣就造成了MazeFactory接口的不穩定,繼承 MazeFactory的所有子類的接口也隨著基類的接口改變而改變。

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

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實例對象的引用參數,typename標識創建對象的類型,*args是創建具體對象時所需的參數列表。魔法迷宮的代碼:

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)表示調用父類的操作創建其它類型的對象。

那么創建一個具體的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方法中添加標示新類型的參數即可:

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

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

參考文獻

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

[2]Erich Gamma,Richard Helm,Ralph Johnson,John Vissides著,李英軍,馬曉星,蔡敏,劉建中等譯.設計模式:可利用面向對象軟件的基礎[M].機械工業出版社,2010,7.

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

主站蜘蛛池模板: 亚洲天堂视频在线播放| 在线观看国产黄色| 亚洲色图另类| 亚洲三级片在线看| 狠狠色香婷婷久久亚洲精品| 国产在线精品人成导航| 人妻无码中文字幕第一区| 制服丝袜亚洲| 久久青草免费91观看| 亚洲an第二区国产精品| 国产色图在线观看| 97se亚洲| 中国国产A一级毛片| 午夜视频在线观看免费网站| 免费中文字幕在在线不卡| 91区国产福利在线观看午夜| 日本人又色又爽的视频| jizz在线观看| 日韩在线中文| 国产一区自拍视频| 午夜一区二区三区| 国产波多野结衣中文在线播放| 国产在线视频福利资源站| 91美女视频在线| 国产成人精品无码一区二| 久久国产毛片| 亚洲午夜18| 中国国产高清免费AV片| 国产91av在线| 中文字幕人成乱码熟女免费| 亚洲人成影院午夜网站| 精品自窥自偷在线看| 免费播放毛片| 无码日韩人妻精品久久蜜桃| 免费一级无码在线网站| 岛国精品一区免费视频在线观看| 国产成人一区在线播放| 国产网友愉拍精品| 久久无码av三级| 日日拍夜夜嗷嗷叫国产| 四虎国产永久在线观看| 国产福利小视频在线播放观看| 久久人人妻人人爽人人卡片av| 国产成人AV男人的天堂| 欧美国产日韩一区二区三区精品影视| 国产精品99在线观看| 成人无码一区二区三区视频在线观看| 亚洲欧美综合精品久久成人网| 高清久久精品亚洲日韩Av| 色综合色国产热无码一| 国产精品一区二区国产主播| 国产精品一区二区不卡的视频| 成人亚洲国产| 国产一区在线观看无码| 国产JIZzJIzz视频全部免费| 国产精品自在线天天看片| 亚洲精品波多野结衣| 一级毛片在线播放| 四虎亚洲国产成人久久精品| 欧美精品亚洲二区| 日韩成人午夜| 亚洲二区视频| 亚洲av无码久久无遮挡| 国产精品手机在线观看你懂的| 青青草原偷拍视频| 亚洲香蕉久久| 中文字幕66页| 91精品国产91久无码网站| 欧美一级黄片一区2区| 色噜噜久久| 伊人欧美在线| 久精品色妇丰满人妻| 中文字幕无码制服中字| 天堂成人在线| 在线观看国产精美视频| 又黄又湿又爽的视频| 国产精品成人第一区| 白浆视频在线观看| 91精品专区| 黄色网站不卡无码| 国产91成人| 国产日韩欧美黄色片免费观看|