设计模式-原型模式


原型模式的定义与特点

*原型(Prototype)模式: * 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象

  • 通俗的说就是对已存在的对象进行对象复制

结构

  1. 抽象原型类: 规定了具体原型对象必须实现的接口
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象
  3. 访问类: 使用具体原型类中的 clone() 方法来复制新的对象

原型模式结构图

实现

通过Java提供的对象的clone()方法实现

  1. 原型模式的克隆分为浅克隆深克隆

  2. *浅克隆: *

    • 使用java提供的clone()方法,原型类实现Cloneable接口重写clone()方法然后调用clone()方法即可复制对象

    • 如果原型类存在引用类型(对象)成员属性,浅克隆不会直接复制对象成员属性,需要该对象类也实现Cloneable接口才行

  3. *深克隆: *序列化实现深克隆,使用对象流把对象写入流中,再从流中读取实现复制对象,原型类需实现Serializable接口,对于不想被序列化的属性需要使用transient修饰

//具体原型类
class RealizeType implements Cloneable,Serializable{
    //public Student student;//引用类型,如果Student类没有实现Cloneable接口,浅克隆不会复制
    public RealizeType() {
        System.out.println("原型对象创建成功!");
    }
    //浅克隆: 实现Cloneable接口,重写clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("原型对象浅克隆成功");
        return super.clone();
    }
    //深克隆: 实现Serializable接口,将对象写入流中再取出
    public RealizeType deepClone(){
        //序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try (ObjectOutputStream output = new ObjectOutputStream(byteArrayOutputStream)) {
            output.writeObject(this);
        }catch(IOException e){
            e.printStackTrace();
        }
        //反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        RealizeType obj = null;
        try (ObjectInputStream input = new ObjectInputStream(byteArrayInputStream)) {
            obj = (RealizeType) input.readObject();
        }catch (IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
        System.out.println("原型对象深克隆成功");
        return obj;
    }
}
    @Test //测试
    public void prototype() throws CloneNotSupportedException {
        //浅拷贝
        RealizeType obj = new RealizeType();
        RealizeType clone = (RealizeType) obj.clone();
        //深拷贝
        RealizeType deepClone = obj.deepClone();
    }

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
设计模式-工厂方法模式 设计模式-工厂方法模式
工厂方法模式的定义 *工厂方法(Factory Method)模式: * 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中,这满足了创建型模式中所要求的”创建与使用相分离”的特点 如果要创建的产品不多,只要一
2020-03-27
下一篇 
设计模式-面向对象设计原则 设计模式-面向对象设计原则
概述 开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭 里氏替换原则告诉我们不要破坏继承体系 依赖倒置原则告诉我们要面向接口编程 单一职责原则告诉我们实现类要职责单一 接口隔离原则告诉我们在设计接口的时候要精简单一 迪米特法则
2020-03-25
  目录