长春网长春网络推广站排名,做名片用哪个网站,全国前十名小程序开发公司,微信小程序开发用什么语言Python 中的原型模式#xff08;Prototype Pattern#xff09;
原型模式是一种创建型设计模式#xff0c;其核心思想是#xff1a; 用一个已存在的对象#xff08;原型#xff09;作为模板#xff0c;通过复制#xff08;克隆#xff09;来创建新的对象#xff0c;而…Python 中的原型模式Prototype Pattern原型模式是一种创建型设计模式其核心思想是用一个已存在的对象原型作为模板通过复制克隆来创建新的对象而不是通过new或构造函数重新创建。适用场景创建对象代价高昂需要大量初始化、IO、网络请求等对象结构复杂但大部分属性相似只需微调希望避免显式构造函数参数爆炸需要快速生成大量相似对象如游戏中的怪物、UI 组件、报表模板等原型模式的优点隐藏创建细节客户端只需调用clone()性能好复制比重新构建快得多方便扩展只需克隆再修改Python 中的实现方式Python 提供了非常方便的内置支持copy模块中的copy()浅拷贝和deepcopy()深拷贝以及__copy__、__deepcopy__钩子。1. 最简单的原型模式使用copy.deepcopy()importcopyclassPrototype:def__init__(self,name,age,skills):self.namename self.ageage self.skillsskills# 列表深拷贝时会复制defclone(self):returncopy.deepcopy(self)def__str__(self):returnf{self.name}({self.age}), skills:{self.skills}# 使用if__name____main__:originalPrototype(Alice,28,[Python,Java,SQL])clone1original.clone()clone1.nameBobclone1.age30clone1.skills.append(Go)clone2original.clone()clone2.nameCharlieprint(Original:,original)print(Clone1: ,clone1)print(Clone2: ,clone2)输出Original: Alice (28), skills: [Python, Java, SQL] Clone1: Bob (30), skills: [Python, Java, SQL, Go] Clone2: Charlie (28), skills: [Python, Java, SQL]2. 更优雅的方式自定义__copy__和__deepcopy__importcopyclassEmployee:def__init__(self,name,department,projects):self.namename self.departmentdepartment self.projectsprojects# 列表def__copy__(self):# 浅拷贝只复制对象本身列表引用共享newself.__class__.__new__(self.__class__)new.__dict__.update(self.__dict__)returnnewdef__deepcopy__(self,memoNone):# 深拷贝递归复制所有可变对象newself.__class__.__new__(self.__class__)new.__dict__.update({name:self.name,department:self.department,projects:copy.deepcopy(self.projects,memo)})returnnewdefclone(self,deepFalse):returncopy.deepcopy(self)ifdeepelsecopy.copy(self)def__str__(self):returnf{self.name}in{self.department}, projects:{self.projects}# 测试empEmployee(Alice,Engineering,[Project A,Project B])# 浅拷贝emp_shallowemp.clone(deepFalse)emp_shallow.nameBobemp_shallow.projects.append(Project C)print(Original:,emp)print(Shallow clone:,emp_shallow)# projects 列表是共享的# 深拷贝emp_deepemp.clone(deepTrue)emp_deep.nameCharlieemp_deep.projects.append(Project D)print(Original (unchanged):,emp)print(Deep clone:,emp_deep)输出Original: Alice in Engineering, projects: [Project A, Project B, Project C] Shallow clone: Bob in Engineering, projects: [Project A, Project B, Project C] Original (unchanged): Alice in Engineering, projects: [Project A, Project B, Project C] Deep clone: Charlie in Engineering, projects: [Project A, Project B, Project D]3. 原型管理器Prototype Registry—— 注册原型并按名称克隆importcopyclassPrototypeRegistry:def__init__(self):self._prototypes{}defregister(self,name,prototype):self._prototypes[name]prototypedefunregister(self,name):delself._prototypes[name]defclone(self,name,**attrs):prototypeself._prototypes[name]clonecopy.deepcopy(prototype)clone.__dict__.update(attrs)# 覆盖或添加属性returnclone# 使用if__name____main__:registryPrototypeRegistry()# 注册几种模板registry.register(basic_car,Car(Basic Car,Sedan,Red,100000))registry.register(sports_car,Car(Sports Car,Coupe,Black,300000))# 克隆并修改car1registry.clone(basic_car,colorBlue,price120000)car2registry.clone(sports_car,nameFerrari,colorYellow,price500000)print(car1)print(car2)原型模式 vs 其他创建型模式对比模式适用场景是否需要构造函数工厂方法根据类型创建不同对象是抽象工厂创建一组相关对象是建造者复杂对象一步步构建否链式原型复制已有对象尤其是初始化代价高否直接 clonePython 中的实际推荐大多数情况下直接用copy.deepcopy()就够了。需要控制浅/深拷贝行为时自定义__copy__和__deepcopy__。需要管理多种模板时使用原型注册器Registry。真实项目中的例子游戏开发克隆怪物、技能、物品报表系统克隆报表模板再修改标题、字段图形编辑器复制图形对象机器学习复制模型配置再微调如果你想看更复杂的例子如游戏角色原型、图形对象克隆、结合其他模式的实现随时告诉我