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

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

作者: 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();
        }
    

    优缺点

    优点:

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

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

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

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

    缺点:

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

    延伸

    相关文章

      网友评论

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

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