一、說明
原型模式是一種創建型設計模式, 用于創建重復的對象,同時又能保證性能。
使一個原型實例指定了要創建的對象的種類,并且通過拷貝這個原型來創建新的對象。
(一) 解決問題
主要解決了對象的創建與復制過程中的性能問題。主要針對:復雜對象和相識對象的創建
在某些情況下,直接使用new
關鍵字或者其他方式創建對象可能會導致性能損耗較大,特別是當對象的創建過程比較復雜或者耗時時。
(二) 使用場景
- 類初始化時需要消耗大量資源,如數據、硬件資源等。通過原型拷貝可以避免這些消耗,提高資源利用率。
- 創建對象時需要繁瑣的數據準備或訪問權限。原型模式可以簡化對象的創建過程,提高性能。
- 一個對象需要提供給其他對象訪問,并且各個調用者可能需要修改其值。通過保護性拷貝,可以創建多個對象供調用者使用,同時保持原對象的狀態不變。
二、結構
- 原型(Prototype):接口將對克隆方法進行聲明。在絕大多數情況下,其中只會有一個名為clone克隆的方法。
- 具體原型(Concrete Prototype):類將實現克隆方法。除了將原始對象的數據復制到克隆體中之外,該方法有時還需處理克隆過程中的極端情況,例如克隆關聯對象和梳理遞歸依賴等等。
- 客戶端(Client):可以復制實現了原型接口的任何對象。
三、偽代碼
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
原型模式
用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。例:通過原型實例克隆多個人的對象,并更新其屬性
"""import copyclass Prototype:def __init__(self):self._objs = {}def register_object(self, key, obj):self._objs[key] = objdef unregister_object(self, key):del self._objs[key]def clone(self, key, **attrs):obj = copy.deepcopy(self._objs[key])obj.__dict__.update(attrs)return objclass People:def __init__(self, name: str, age: int):self.name = nameself.age = agedef __str__(self):return f"{self.__dict__}"if __name__ == '__main__':"""Original: {'name': '張三', 'age': 20}Clone: {'name': '李四', 'age': 24}"""# 創建原型對象prototype = Prototype()# 創建一個 People 實例并注冊為原型對象people = People(name="張三", age=20)prototype.register_object("people", people)# 克隆一個 People 實例people_clone = prototype.clone("people", name="李四", age=24)# 輸出原型對象和克隆對象print("Original:", people)print("Clone:", people_clone)
四、優缺點
優點
- 性能提升:通過復用已有對象,避免了重復的對象創建和初始化過程,從而提高了性能。
- 簡化創建過程:客戶端代碼無需知道對象創建的細節,只需要調用克隆方法即可。
缺點
- 復雜度增加:需要實現克隆方法
- 深拷貝和淺拷貝問題:在實現克隆方法時,需要考慮深拷貝和淺拷貝的問題。淺拷貝只復制對象本身和其中的基本數據類型,而深拷貝會復制對象及其引用的所有對象。如果處理不當,可能會導致對象之間的意外關聯或修改。
?跳轉主頁:【Python筆記】設計模式-CSDN博客