程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 設計模式:原型模式

編輯:Python


定義


原型模式(Prototype Pattern)是一種創建型設計模式, 使你能夠復制已有對象, 而又無需使代碼依賴它們所屬的類。原型模式能夠讓我們利用克隆技術在現有對象的基礎上創建對象。


說到克隆,一個著名的非技術性例子是名為多莉的綿羊,它是由蘇格蘭的研究人員通過克隆乳腺中的一個細胞創造的。




許多 Python 應用程序都使用了原型模式,但它很少被稱為原型,因為克隆對象是語言的一個內置功能。


原型模式的想法是使用該對象的完整結構的拷貝來產生新的對象。我們將看到,這在 Python 中幾乎是自然而然的,因為我們有一個拷貝功能,對使用這種技術有很大幫助。在創建一個對象的拷貝的一般情況下,所發生的是你對同一個對象做一個新的引用,這種方法叫做淺拷貝。但如果你需要復制對象,也就是原型的情況,你要做一個深拷貝。


實現


原型模式建議創建一個接口來創建現有對象的克隆。任何客戶都可以依賴的對象。Python 中可以通過類來進行實例化:

  • 原型類:一個超類,它將包含對象克隆將具有的所有必要屬性和方法。此外,Prototype 有一個抽象的 clone() 方法,它必須由所有子類實現。

  • 具體類:一旦我們創建了原型超類,我們就可以開始基於超類定義具體類。具體類是可選的,可以在應用程序中定義。

具體的類可以有自己的屬性和方法,但它們總是有原始的原型屬性和被覆蓋的 clone() 版本。




在 Python 中,考慮為 Car 對象創建一個原型。讓我們為汽車創建一個接口:


class Car: def __init__(self, engine="1500cc", color="D-white", seats=7): self.engine = engine self.color = color self.seats = seats def __str__(self): return f"{self.engine} | {self.color} | {self.seats}"


原型類:

  • 原型接口有一個字典數據結構來存儲所有克隆的對象。

  • RegisterObject 方法在字典中添加元素,以新對象的名稱為鍵,以現有對象為值。

  • DeregisterObject 方法從字典中刪除條目。

  • 並且,最後通過 Clone 方法復制現有對象。克隆方法使用來自 Copy 模塊的 deepcopy() 方法來克隆對象。

import copyclass Prototype: def __init__(self): """Dictionary that will stores cloned objects.""" self._ClonedObjects = {} def RegisterObject(self, name, obj): """Method to store all clones of the existion objects.""" self._ClonedObjects[name] = obj def DeregisterObject(self, name): """Method to delete the cloned object from the dictionary.""" del self._ClonedObjects[name] def Clone(self, name, **kwargs): """Method to clone the object.""" clonedObject = copy.deepcopy(self._ClonedObjects.get(name)) clonedObject.__dict__.update(kwargs) return clonedObject

最後,我們利用 main 函數來測試:

if __name__ == "__main__": """The object that will be cloned.""" defaultCar = Car() prototype = Prototype() """The object that will be cloned.""" CarType1 = Car("1000cc", "Red", 4) """Registering the defaultCar in dictionary with its key as 'basicCar'""" prototype.RegisterObject('BasicCar', defaultCar) prototype.RegisterObject('Type-1', CarType1) carOne = prototype.Clone('BasicCar', color = "Lake side brown") carTwo = prototype.Clone('Type-1',color = "Red") carThree = prototype.Clone('Type-1', color = "Moon Dust Silver") print("Details of the default-car:", defaultCar) print("Details of car-One:", carOne) print("Details of car-Two:", carTwo) print("Details of car-Three:", carThree) 


運行輸出:

$ python protype.py Details of the default-car: 1500cc | D-white | 7Details of car-One: 1500cc | Lake side brown | 7 Details of car-Two: 1000cc | Red | 4Details of car-Three: 1000cc | Moon Dust Silver | 4

總結


原型是一種創建型設計模式, 使你能夠復制對象, 甚至是復雜對象, 而又無需使代碼依賴它們所屬的類。


所有的原型類都必須有一個通用的接口, 使得即使在對象所屬的具體類未知的情況下也能復制對象。 原型對象可以生成自身的完整副本, 因為相同類的對象可以相互訪問對方的私有成員變量。


原型模式減少了子類的數量,隱藏了創建對象的復雜性,並便於在運行時添加或刪除對象。



參考鏈接:

  1. 深入設計模式:原型模式

  2. The Prototype Pattern

  3. The Prototype Design Pattern in Python


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved