JAVA设计模式之【原型模式】

41 阅读1分钟

原型模式.png

原型模式.png

快速构建对象方法:

使用简单工厂将get,set封装到某个方法中(Client类)
JDK提供实现Cloneable接口实现快速复制

1 类图

图片

2 适用场景

1、类初始化消耗资源较多。
2、new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
3、构造函数比较复杂。
4、循环体中生产大量对象时。

3 原型模式案例

BeanUtils.copy();
JSON.parseObject()

4 深浅克隆

4.1 浅克隆

创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

4.1.2 浅克隆代码案例

必须让目标类实现Cloneable接口,重写java.lang.Object的clone()

@Override
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

4.2 深克隆

创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

4.2.2 深克隆代码案例

@Override
public Object clone() throws CloneNotSupportedException {
    try {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(out);
        oos.writeObject(this);
        oos.close();
        //从内存中取出
        byte[] bb = out.toByteArray();
        ByteArrayInputStream in = new ByteArrayInputStream(bb);
        ObjectInputStream ois = new ObjectInputStream(in);
        Object clone = ois.readObject();
        ois.close();
        return clone;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

4.3 克隆会破坏单例模式

4.3.1 解决方式

要么单例类不实现Cloneable 接口;要么重写 clone()方法,在 clone 方法中返回单例对象即可。

@Override
protected Object clone() throws CloneNotSupportedException {
    return this.deepClone();
}

绿色软件搜索【谷丘Coder】关注后台发送【原型模式】获取笔记资料与思维导图