设计模式-创建型模式之原型模式

2019-02-15  本文已影响0人  gooddaytoyou

定义

原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。

相关的角色
Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户类

解决问题

解决某些结构复杂的对象的创建工作。

UML类图

prototype.png

例子

在Java实现原型模式的方法,一般是继承Cloneable接口。

浅拷贝
对于值类型的成员变量,对值进行复制,对于引用类型的成员变量,只复制引用,不复制引用的对象。

public class MonkeyKingPrototype implements Cloneable {
    private String name;
    private Color color;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public MonkeyKingPrototype(String name, Color color) {
        this.name = name;
        this.color = color;
    }

    @Override
    public Object clone() {
        MonkeyKingPrototype monkeyKingPrototype = null;
        try {
            monkeyKingPrototype = (MonkeyKingPrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return monkeyKingPrototype;
    }
}

调用

    MonkeyKingPrototype monkeyKingPrototype = new MonkeyKingPrototype("monekyOne", new Color("red"));

    MonkeyKingPrototype monkeyKingPrototypeClone = (MonkeyKingPrototype) monkeyKingPrototype.clone();
    System.out.println(monkeyKingPrototypeClone.getName() + "," + monkeyKingPrototypeClone.getColor().getColor());
    monkeyKingPrototypeClone.getColor().setColor("green");

    System.out.println(monkeyKingPrototype.getName() + "," + monkeyKingPrototype.getColor().getColor());

深拷贝
深拷贝分两种

通过对子引用对象创建

  public Object deepClone() {
        MonkeyKingPrototype monkeyKingPrototype = null;
        try {
            monkeyKingPrototype = (MonkeyKingPrototype) super.clone();
            monkeyKingPrototype.eye = new Eye(this.getEye().getColor());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return monkeyKingPrototype;
    }

通过利用串行化来做深复制
把对象写到流里的过程是串行化(Serilization)过程;把对象从流中读出来是并行化(Deserialization)过程. 写在流里的是对象的一个拷贝,然后再从流里读出来重建对象.需要实现

 Serializable

通过对象流的形式拷贝

 public Object deepClone() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(this);

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        return objectInputStream.readObject();
    }

优缺点

优点:

缺点:

延伸

上一篇下一篇

猜你喜欢

热点阅读