创建型--原型模式

模式的意图

原型,可以理解为一些复制品的父类型,这些复制品都是从它而来的,而原型模式也就是要解决不希望反复使用类的构造方法创建对象而提出来的一种模式。
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

模式的适用性

在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望用该类创建一个对象后,以该对象为原型得到该对象的若干个复制品。

参与者

抽象原型(Prototype):一个接口,负责定义对象复制自身的方法。
具体原型(Concrete Prototype):实现Prototyre接口的类。具体原型实现抽象原型中的方法,以便创建的对象调用该方法复制自己。

原型模式比较简单,容易理解,就是不希望不断的通过构造方法来调用对象,而是希望通过已有的原型为模板来复制对象。

通过例子来了解一下:
抽象原型

Prototype.java
public interface Prototype {
public Object cloneMe() throws        CloneNotSupportedException;
}

具体原型

Cubic.java
public class Cubic {
    double length,width,height;
    public Cubic(double a, double b, double c) {
        length = a;
        width = b;
        height = c;
    }
    public Object cloneMe() throws CloneNotSupportedException {
        Cubic object = (Cubic)clone();
        return object;
    }
}
Goat.java
public class Goat {
    StringBuffer color;
    public void setColor(StringBuffer c) {
        color = c;
    }

    public StringBuffer getColor() {
        return color;

    }

    public Object cloneMe() throws  CloneNotSupportedException {
        Object object = null;
        try {
            ByteArrayOutputStream outOne = new ByteArrayOutputStream();
            ObjectOutputStream outTwo = new ObjectOutputStream(outOne);
            outTwo.writeObject(this);
            ByteArrayInputStream inOne = new ByteArrayInputStream(outOne.toByteArray());
            ObjectInputStream inTwo = new ObjectInputStream(inOne);
            object = inTwo.readObject();
        } catch (Exception e) {
            System.out.println(e);
        }
        return object;
    }
}

我们在具体原型中定义了两个原型,都实现了cloneMe()这个方法,我们可以通过这两个方法调用来得到这两个具体原型的复制品。
具体类图:
这里写图片描述

优点

  1. 当创建类的新实例的代价更大时,使用原型模式复制一个已有的实例可以提高创建新实例的效率。
  2. 可以动态的保存当前对象的状态。
  3. 可以在运行时创建新的对象,而无须创建一系列类和继承结构。
  4. 可以动态的添加、删除原型的复制品。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值