原型模式的定义
"使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象"。最初的定义出现于《设计模式》(Addison-Wesley,1994)。
结构图
从上图可以看到,Mark类中包括一个copy方法,Client调用其拷贝方法copy即可得到实例,不需要手工去创建实例。Dot和Stroke为Mark的子类,实现自身的clone方法,如果Client调用Dot的clone方法,将返回Dot的实例。
何时用原型模式
- 需要创建的对象应独立于其类型与创建方式
- 要实例化的类是在运行时决定的
- 不想要与产品层次相对应的工厂层次
- 不同类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便
- 类不容易创建,比如每个组件可以把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易
以下两种特别常见的情形,我们会想到用原型模式: - 有很多的相关的类,其行为略有不同,而且主要差异在于内部属性,如名称等
- 需要使用组合(树)对象作为其他对象的基础,比如,使用组合对象作为组件来构建另一个组合对象