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

引导性开场

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

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

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

渐进式介绍概念

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

菜鸟:当然有啊。

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

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

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

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

Python代码示例,逐步展开

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

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name}, {self.age} years old'

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

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

python 复制代码
person1 = Person('Alice', 30)
person2 = Person('Bob', 25)

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

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

python 复制代码
import copy

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name}, {self.age} years old'

    def clone(self):
        return copy.deepcopy(self)

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

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

python 复制代码
person1 = Person('Alice', 30)
person2 = person1.clone()
person2.name = 'Bob'
person2.age = 25

print(person1)  # Alice, 30 years old
print(person2)  # Bob, 25 years old

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

问题与反思

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

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

优势与适用场景

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

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

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

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

常见误区与优化建议

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

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

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

总结与延伸阅读

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

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

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

菜鸟:好的,非常感谢!

相关推荐
我不会编程555几秒前
Python Cookbook-6.10 保留对被绑定方法的引用且支持垃圾回收
开发语言·python
ʚɞ 短腿欧尼2 分钟前
关系数据的可视化
python·pycharm·可视化·数据可视化·图表
麓殇⊙1 小时前
设计模式--建造者模式详解
设计模式·建造者模式
不当菜虚困1 小时前
JAVA设计模式——(八)单例模式
java·单例模式·设计模式
Java致死2 小时前
工厂设计模式
java·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式
全栈凯哥3 小时前
桥接模式(Bridge Pattern)详解
java·设计模式·桥接模式
PXM的算法星球3 小时前
【软件工程】面向对象编程(OOP)概念详解
java·python·软件工程
Humbunklung3 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)
笔记·python·学习·pyqt
蹦蹦跳跳真可爱5894 小时前
Python----深度学习(基于DNN的吃鸡预测)
python·深度学习·dnn
北漂老男孩4 小时前
设计模式全解析:23种经典设计模式及其应用
单例模式·设计模式