美文网首页
设计模式-创建型模式之原型模式

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

作者: gooddaytoyou | 来源:发表于2019-02-15 11:50 被阅读0次

定义

原型模式(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();
    }

优缺点

优点:

  • 原型模式向客户隐藏了创建新实例的复杂性;

  • 原型模式允许动态增加或较少产品类;

  • 原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样;

  • 产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构。

缺点:

  • 每个类必须配备一个克隆方法;
  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

延伸

相关文章

  • android常用设计模式

    26种设计模式 创建型设计模式[5] 单例模式,工厂模式,抽象工厂模式,建造模式,原型模式,[简单工厂模式] 结构...

  • 设计模式之原型模式

    设计模式之原型模式 原型模式 属于 创建型模式,提供创建对象的最佳方式。 原型模式 简介 也就是 说 根据一个已有...

  • 三、原型模式

    原型模式用于创建重复对象的同时保持性能,该模式属于创建型设计模式,是创建对象的最佳实现方式。 为什么要使用原型模式...

  • 初始设计模式之原型模式

    原型模式是什么? 原型模式怎么用?浅拷贝深拷贝 原型模式再理解 一、原型模式是什么? ​ 原型模式是一种创建型设计...

  • 设计模式[4]-原型模式-Prototype Pattern

    1. 原型模式简介 原型模式(Prototype Pattern)是创建型设计模式,根据一个原型对象,通过Clon...

  • JavaScript设计模式

    设计模式分类(23种设计模式) 创建型单例模式原型模式工厂模式抽象工厂模式建造者模式 结构型适配器模式装饰器模式代...

  • 创建型设计模式——原型模式

    定义 原型模式是一个创建型的设计模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式多用于...

  • Java设计模式之04_Prototype(原型模式)

    更多Java设计模式:Java设计模式-目录 原型模式是一种简单、易使用的创建型设计模式,通过给出一个原型对象来指...

  • S3. 原型模式

    原型模式(Prototype) baidu[www.baidu.com] 原型模式是一种创建型设计模式,其功能为复...

  • 设计模式小结

    设计模式 7 大原则 创建型 单例模式 原型模式 创建者模式(生成器模式) 简单工厂模式 工厂方法模式 抽象工厂模...

网友评论

      本文标题:设计模式-创建型模式之原型模式

      本文链接:https://www.haomeiwen.com/subject/wjqyeqtx.html