java设计模式--原型模式

原型模式定义:用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 原型模式的核心是一个clone方法, 通过该方法进行对象的拷贝, Java 提供了一个Cloneable接口来标示这个对象是可拷贝的,在JVM中具有这个标记的对象才有可能被拷贝。 比如:比如批量发送邮件,邮件模板是一样的,发送给不同的人内容不同,那么就可以把模板 clone 给不同的发送者,发送者修改一下内容模板内容,然后就发送。就是生产一个对象不是从new开始的,而是从已经存在的一个对象直接拷贝过来,然后修改修改就好了。

优点:

1、原型模式是在内存中二进制流的拷贝,要比直接new性能好很多。如果在一个循环体内创建大量对象,原型模式能体现出他的优点。

2、由于是二进制的拷贝,所有构造函数不会被执行。这也是优点,也是缺点,在实际应用中要考虑。使用场景:一个对象要给其它对象访问,并且其它对象可能会修改这个对象。可以考虑使用原型模式。

注意事项:

1、构造函数不会被执行浅拷贝Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫做浅拷贝。Java初高级一起学习分享,共同学习才是最明智的选择,喜欢可以jia我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3.注:String 是不可变的,处理机制比较特殊,通过字符串池在需要的时候才在内存中创建新的字符串。

示例代码:

public class Prototype implements Cloneable

{    private Listlist = new ArrayList<>();   

@Override   

protected Object clone() throws CloneNotSupportedException

{        //浅拷贝        return super.clone();    }   

public void add(String str) {   list.add(str);    }    

public List getList() {  return list;  } 

 /**  * 测试代码 * @throws Exception  */ 

 public static void main(String[] args) throws Exception

{ Prototype prototype = new Prototype();  prototype.add("A");  Prototype clone = (Prototype)prototype.clone();  clone.add("B");  

//此处打出 A , B  System.out.println(prototype.getList());  //此处打出 A , B  System.out.println(clone.getList()); }  }

说明: 运行结果打印出 [A, B] prototype,clone两个对象引用的是同一样ArrayList。 深拷贝 对象内部的数组、引用对象等要手动拷贝。

示例代码:

修改上面的clone() 方法如下

@Override

protected Object clone() throws CloneNotSupportedException 

{ //深拷贝 Prototype clone = (Prototype)super.clone(); clone.list = (ArrayList)((ArrayList)this.list).clone();  return clone;  }

修改后就正常了 还有一点要注意的是:想要clone 的属性,不能是final的。

你可能感兴趣的:(java设计模式--原型模式)