Prototype(原型)

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_相关文档


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值