python 实现原型设计模式
原型設計模式主要在當新建一個對象的時候,覺得很麻煩,并且你又要保留當前對象。在這種情況下使用原型設計模式是一個很好的解決辦法。
例如你寫一個東西更新,不同的版本,這個時候以前的版本肯定要保留,并且從此基礎上進行迭代,這個時候你就需要新建一個副本進行二次編寫或者開發,進行新功能編寫。
在我理解,設計模式是一種設計思想、解決方案,并不局限于固定的代碼編寫方式,只要符合于該思想即可,所以代碼的實現只是一個實現樣例,并不是唯一答案。畢竟條條道路通北京,怎么走還是得看你自己。
想要完全的從實際業務上考慮代碼設計所使用的設計模式,需要豐富的項目編寫(業務邏輯處理)經驗,所以在此并不多舉例應用場景,畢竟你也有可能把一個原型模式玩出了花。
開始
以下例子用一個礦泉水生產不同的外觀進行舉例。
礦泉水生產,同一個類型可能有不同包裝版本。體積容量、包裝樣式可能一致,不同版本可能外表印刷顏色不同。
首先寫一個類(為了方便新手,以下會說明代碼釋義,完整代碼在最下面):
class MineralWater:volume = '' # 體積packing = '' # 包裝用瓶子name = '' # 顏色def __init__(self, name,volume,packing):self.name = nameself.volume = volumeself.packing = packingdef set_name(self, name):self.name = namedef get_name(self):return self.namedef get_volume(self):return self.volumedef get_packing(self):return self.packing類名為 MineralWater(礦泉水),有3個類成員變量:
- volume 用來描述裝水的體積
- packing 用來描述包裝水的物體用什么
- name 表示不同的型號包裝,不同型號會導致印刷不一樣
類中一共有5個方法,初始化一個,其余方法為成員變量的存取方法:
- __init__ 方法用來初始化原型,接收參數為 name,volume以及packing
- set_name 方法用來設置name 變量
- get_name 方法用來取得name 變量
- 其他方法是存取方法,不再贅述
再建一個工廠類:(這個類其實可以不用,不過為了方便說明,再次還是寫一下。讀者只需要了解其中關鍵代碼即可)
class Factory:def __init__(self, name):self.name = nameself.mwater = MineralWater('礦泉水卡通版',555,"plastic_bottle") # 原型def assembly_line(self):#工廠裝配for v in self.name:mwater_ = copy(self.mwater)mwater_.set_name(v)print('已裝配 ', mwater_.get_name(),' 礦泉水,容量為 ' ,mwater_.get_volume(), ',包裝為:' + mwater_.get_packing())print('\n原型并未被改變: ', self.mwater.get_name(),' 礦泉水,容量為 ' ,self.mwater.get_volume(), ',包裝為:' + self.mwater.get_packing())Factory(工廠類)中有2個方法,一個為初始化 __init__ 方法,一個為 assembly_line (流水線)方法。__init__ 方法中定義了原型,assembly_line 方法實現了原型復制。
在 __init__ 初始化方法中接收一個產品型號說明變量 name作為參數,由于之后需要遍歷這個參數,所以該參數應該設置為列表或者是元組;并且在name進行設置后,定義了一個原型對象 mwater,mwater為卡通版,容量為555毫升,包裝使用 plastic_bottle (塑料瓶)。
在 assembly_line流水線方法中,遍歷了傳入的列表或者元組成員數據name,每一次遍歷使用 mwater_ = copy(self.mwater) 復制一個對象(copy需要引入:from copy import copy),并且使用 mwater_.set_name(v) 設置新的對象name值**(這個v為傳入的不同版本的名稱)**,隨后使用print進行輸出,每次其它相同值并不需要重新設置,只需要改變不同的值即可。最后輸出原型對象查看其數據是否被改變。
測試代碼:
f = Factory(['礦泉水卡通版', '礦泉水程序員版', '礦泉水產品經理版']) f.assembly_line()運行結果:
結果發現原型并未改變,符合需求。
完整代碼:
總結
以上是生活随笔為你收集整理的python 实现原型设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3 实现建造者模式
- 下一篇: python 最简单的实现适配器设计模式