原型模式

2021-09-25  本文已影响0人  攻城虱小马褂

关于克隆,我们会想到《西游记》里面孙悟空的猴毛分身,也会想到《火影忍者》里面的影分身之术。他们都是用一个物体复制若干个一模一样的物体。在面向对象的系统中,我们也可以通过克隆来复制一些对象---也就是我们所说的原型模式

用原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象,也就是利用一个原型对象来指明我们要创建对象的类型,然后通过复制这个对象来获取一模一样的对象实例

一个简单的原型模式Demo

public class PrototypeClass implements Cloneable{
    @Override
    protected PrototypeClass clone(){
        PrototypeClass prototypeClass = null;
        try {
            prototypeClass = (PrototypeClass)super.clone();
        }catch (CloneNotSupportedException e){

        }
        return prototypeClass;
    }
}

为什么要用原型模式

原型模式应用场景

  1. 资源优化场景
  2. 性能和安全要求场景
  3. 一个对象多个修改者的场景

两种拷贝方式

浅拷贝

只拷贝本对象,对象内部的数组、引用对象都不拷贝,还是指向原生对象的内部元素地址。原始类型(int、long、char)以及String都会被拷贝

如何才能保证成员变量不被拷贝(保证以下两个条件)
public class Thing implements Cloneable {
    private List<String> list = new ArrayList<String>();

    @Override
    protected Thing clone(){
        Thing thing = null;
        try {
            thing = (Thing)super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return thing;
    }
    
    public void setValue(String value){
        this.list.add(value);
    }
    
    public List<String> getValue(){
        return this.list;
    }
}

浅克隆是不安全的方式,两个对象共享了一个私有变量,大家都能够进行修改。

深拷贝

public class DeepThing implements Cloneable {
    private ArrayList<String> list = new ArrayList<String>();

    @Override
    protected DeepThing clone(){
        DeepThing thing = null;
        try {
            thing = (DeepThing)super.clone();
            this.list = (ArrayList<String>)this.list.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return thing;
    }

    public void setValue(String value){
        this.list.add(value);
    }

    public List<String> getValue(){
        return this.list;
    }
}

总结

上一篇 下一篇

猜你喜欢

热点阅读