Prototype(原型) 创建型 对象 1
Intent_意图2
通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象
Motivation_动机3
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式
Applicability_适用性4
1.当一个系统应该独立于它的产品创建,构成和表示时
2.当要实例化的类是运行时刻指定时,例如:通过动态加载
3.为了避免创建一个与产品类层次平行的工厂类层次时
4.当一个类的实例只能有几个不同状态组合中的一种时。建立 相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些
Structure_结构5
Participants_参与者6
- Client(客户) 客户类提出创建对象的请求
- Prototype(抽象原型) 一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口
- ConcretePrototype(具体原型) 被复制的对象。此角色需要实现抽象原型所要求的接口
Collaborations_协作7
Prototype定义原型的接口
->ConcretePrototype实现Prototype的接口,成为具体被复制的对象
Client与Prototype沟通,得到相对应的复制原型
Comsequences_结果8
- 优点
向客户隐藏创建新实例的复杂过程
提供让客户能够产生未知类型对象的选项
在某些环境下,复制对象比创建新对象更有效 - 缺点
对象的复制有时相当复杂 - 用途
在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型
Implementation/Sample Code_实现/范例代码910
Prototype
public interface Prototype {
/**
* 克隆自身的方法
*
* @return 一个从自身克隆出来的对象
*/
public Object clone();
}
ConcretePrototype
public class ConcretePrototypeA implements Prototype {
public ConcretePrototypeA() {
System.out.println("Create a new concrete prototype A object");
}
@Override
public Object clone() {
// 最简单的克隆,新建一个自身对象
Prototype prototype = new ConcretePrototypeA();
return prototype;
}
}
public class ConcretePrototypeB implements Prototype {
public ConcretePrototypeB() {
System.out.println("Create a new concrete prototype B object");
}
@Override
public Object clone() {
// 最简单的克隆,新建一个自身对象
Prototype prototype = new ConcretePrototypeB();
return prototype;
}
}
Client
public class Client {
// 持有需要使用的原型接口对象
private Prototype prototype;
// 构造方法,传入需要使用的原型接口对象
public Client(Prototype prototype) {
this.prototype = prototype;
}
public void operation() {
// 需要创建原型接口的对象
Prototype clonePrototype = (Prototype) prototype.clone();
}
}
Demo
public class Demo {
public static void main(String[] args) {
Prototype prototypeA = new ConcretePrototypeA();
Prototype prototypeB = new ConcretePrototypeB();
Client client = new Client(prototypeB);
client.operation();
}
}
Result
Create a new concrete prototype A object
Create a new concrete prototype B object
Create a new concrete prototype B object
Known Uses_已知应用11
Related Patterns_相关模式12
Related Document_相关文档
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎