目录
意图
- 使用原型实例指定要创建的对象的种类,并通过复制此原型来创建新对象。
- 选择一个类的一个实例作为所有未来实例的繁殖者。
new
运营商认为有害。
问题
应用程序“硬连接”要在每个“新”表达式中创建的对象类。
讨论
声明一个指定纯虚拟“克隆”方法的抽象基类,并维护所有“可克隆”具体派生类的字典。任何需要“多态构造函数”能力的类:从抽象基类派生自身,注册其原型实例,并实现clone()
操作。
然后,客户端不再编写在硬连线类名称上调用“new”运算符的代码,而是在抽象基类上调用“克隆”操作,提供指定特定具体派生类的字符串或枚举数据类型。 .
结构
工厂知道如何找到正确的原型,每个产品都知道如何产生自己的新实例。

例子
原型模式指定使用原型实例创建的对象类型。新产品的原型通常是在全面生产之前构建的,但在这个例子中,原型是被动的,不参与复制自身。细胞的有丝分裂 – 产生两个相同的细胞 – 是原型的一个例子,它在复制自身中发挥积极作用,因此展示了原型模式。当一个细胞分裂时,会产生两个基因型相同的细胞。换句话说,细胞克隆自己。

检查清单
- 将
clone()
方法添加到现有的“产品”层次结构。 - 设计一个维护原型对象缓存的“注册表”。注册表可以封装在一个新
Factory
类中,或者封装在“产品”层次结构的基类中。 - 设计一个工厂方法:可能(或可能不)接受参数,找到正确的原型对象,调用
clone()
该对象,并返回结果。 - 客户端将所有对操作符的引用替换
new
为对工厂方法的调用。
经验法则
- 有时,创建模式是竞争对手:在某些情况下,原型或抽象工厂都可以正确使用。在其他时候它们是互补的:抽象工厂可能存储一组原型,从中克隆和返回产品对象。Abstract Factory、Builder 和 Prototype 可以在它们的实现中使用 Singleton。
- 抽象工厂类通常使用工厂方法实现,但它们可以使用原型来实现。
- 工厂方法:通过继承创建。原型:通过委托创建。
- 通常,设计从使用工厂方法(不太复杂、更可定制、子类激增)开始,然后随着设计人员发现需要更多灵活性的地方而向抽象工厂、原型或构建器(更灵活、更复杂)发展。
- Prototype 不需要子类化,但它确实需要“初始化”操作。工厂方法需要子类化,但不需要初始化。
- 大量使用 Composite 和 Decorator 模式的设计通常也可以从 Prototype 中受益。
- Prototype 选择一个类的一个实例作为所有未来实例的繁殖者。
- 当对象初始化很昂贵并且您预计初始化参数的变化很小时,原型很有用。在这种情况下,Prototype 可以避免昂贵的“从头创建”,并支持廉价克隆预初始化原型。
- Prototype 在其他创建模式中是独一无二的,因为它不需要类——只需要一个对象。像 Self 和 Omega 这样取消类的面向对象语言完全依赖于原型来创建新对象。
本文来自转载,原文链接: