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