java设计模式--原型模式

作者: 代码墨白 | 来源:发表于2018-07-07 14:44 被阅读4次

    原型模式定义:用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 原型模式的核心是一个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设计模式--原型模式

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