原型模式
原型模式是一种设计模式,其主要思想是通过复制现有对象的实例来创建新对象,而不是通过标准的构造函数创建。 这种方法对于那些创建过程复杂或者初始化过程需要大量资源的对象特别有用,因为它可以节省时间和资源。 在原型模式中,一个原型对象可以被复制多次,每次复制都生成一个新的独立实例,这些实例与原型对象具有相同的属性。
这种模式通常适用于以下情况:
创建对象实例的过程比较昂贵或者复杂。
创建对象时需要大量的资源,例如数据库连接,文件系统等。
复制对象的实例可以改善性能,特别是在大规模对象的创建过程中。
from __future__ import annotations
from typing import Any
class Prototype:
def __init__(self, value: str = "default", **attrs: Any) -> None:
self.value = value
self.__dict__.update(attrs)
def clone(self, **attrs: Any) -> Prototype:
"""Clone a prototype and update inner attributes dictionary."""
# copy.deepcopy
obj = self.__class__(**self.__dict__)
obj.__dict__.update(attrs)
return obj
class PrototypeDispatcher:
"""在原型模式中,Prototype Dispatcher(原型调度器)类通常用于管理和存储不同类型的原型对象,
以便在需要时能够根据某种标识或名称获取相应的原型对象。
这个类的作用包括:
* 注册原型对象:Prototype Dispatcher 可以充当一个注册中心,用于注册和存储各种原型对象,以便方便后续的访问和复制。
* 获取原型对象:通过 Prototype Dispatcher 类的方法,可以根据特定的标识符或名称来获取相应的原型对象实例,从而避免直接访问各个原型对象。
* 统一管理:通过 Prototype Dispatcher 类,可以统一管理项目中的各种原型对象,避免代码中散落各处的原型对象实例化和管理逻辑。
"""
def __init__(self):
self._objects = {}
def get_objects(self) -> dict[str, Prototype]:
"""Get all objects."""
return self._objects
def register_object(self, name: str, obj: Prototype) -> None:
"""Register an object."""
self._objects[name] = obj
def unregister_object(self, name: str) -> None:
"""Unregister an object."""
del self._objects[name]
def main() -> None:
"""
>>> dispatcher = PrototypeDispatcher()
>>> prototype = Prototype()
>>> d = prototype.clone()
>>> a = prototype.clone(value='a-value', category='a')
>>> b = a.clone(value='b-value', is_checked=True)
>>> dispatcher.register_object('objecta', a)
>>> dispatcher.register_object('objectb', b)
>>> dispatcher.register_object('default', d)
>>> [{n: p.value} for n, p in dispatcher.get_objects().items()]
[{'objecta': 'a-value'}, {'objectb': 'b-value'}, {'default': 'default'}]
>>> print(b.category, b.is_checked)
a True
"""
if __name__ == "__main__":
import doctest
doctest.testmod()
Last modified: 30 August 2024