欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 漫谈设计模式 [4]:原型模式

漫谈设计模式 [4]:原型模式

2024/10/24 22:31:01 来源:https://blog.csdn.net/qq_35082030/article/details/142006412  浏览:    关键词:漫谈设计模式 [4]:原型模式

引导性开场

菜鸟:老鸟,我最近在做一个项目,需要创建很多相似的对象,但每次都要写很多重复的代码,感到有点头疼。有没有什么方法可以简化这个过程?

老鸟:这个问题很常见,其实有一个设计模式叫做“原型模式”可以帮助你解决这个问题。你想知道更多吗?

菜鸟:当然,听起来很有意思!

渐进式介绍概念

老鸟:好,我们先从一个简单的例子开始。你有没有买过外卖?

菜鸟:当然有啊。

老鸟:那你有没有注意到,每次你点的餐都差不多,但还是需要重复选择和确认?

菜鸟:是的,每次都要点很多相似的选项,有点烦。

老鸟:原型模式就像是保存了一份你常点餐的菜单模板,每次点餐的时候,只需要复制这个模板,再根据需要进行微调。这样就省去了重复选择的麻烦。

菜鸟:哦,明白了,那在编程中怎么实现呢?

Python代码示例,逐步展开

老鸟:我们用Python来实现一个简单的例子。假设我们有一个Person类。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'{self.name}, {self.age} years old'

菜鸟:这个类很简单,就是一个人的信息。

老鸟:对,现在我们每次都需要创建不同的Person对象,例如:

person1 = Person('Alice', 30)
person2 = Person('Bob', 25)

菜鸟:对,这样每次都要重新创建对象。

老鸟:现在我们引入原型模式,通过复制现有的对象来创建新的对象。我们可以给Person类添加一个clone方法。

import copyclass Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'{self.name}, {self.age} years old'def clone(self):return copy.deepcopy(self)

菜鸟:这个clone方法是用来复制对象的?

老鸟:对的,现在我们可以这样创建新的对象:

person1 = Person('Alice', 30)
person2 = person1.clone()
person2.name = 'Bob'
person2.age = 25print(person1)  # Alice, 30 years old
print(person2)  # Bob, 25 years old

菜鸟:哇,这样就省去了重复创建对象的麻烦!

问题与反思

菜鸟:那如果没有原型模式,我是不是只能每次都手动创建对象?

老鸟:是的,手动创建不仅麻烦,而且容易出错。原型模式通过复制现有对象,确保了对象的一致性和简化了代码。

优势与适用场景

老鸟:原型模式的优势在于它可以很方便地创建复杂对象的副本,节省了初始化的时间和成本。适用于以下场景:

  1. 创建对象的过程比较复杂。
  2. 想要避免重复代码。
  3. 需要创建对象的副本并进行微调。

菜鸟:听起来很实用,那有现实生活中的例子吗?

老鸟:比如,你在绘图软件中创建了一个复杂的图形模板,每次需要用这个模板的时候,只需要复制一份,再进行修改,而不是重新创建。

常见误区与优化建议

菜鸟:那使用原型模式会有什么误区吗?

老鸟:常见的误区是没有深拷贝,导致修改副本时影响到原对象。要确保使用deepcopy来避免这个问题。另外,要注意对象中是否有无法复制的资源,如文件句柄或数据库连接。

菜鸟:明白了,我会注意这些问题的。

总结与延伸阅读

老鸟:今天我们学习了原型模式,它通过复制现有对象来创建新的对象,避免了重复代码,简化了对象的创建过程。你可以进一步阅读《设计模式:可复用面向对象软件的基础》这本书,了解更多设计模式。

菜鸟:谢谢老鸟,我会去看的!下一步我应该学什么设计模式呢?

老鸟:你可以学习单例模式和工厂模式,它们也是很实用的设计模式。

菜鸟:好的,非常感谢!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com