JAVA设计模式之原型模式

一、原型模式的定义

               原型模式的简单程度仅次于单例模式和迭代器模式。因为简单,所以使用的场景才比较多 :

             用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

             原型模式的核心是一个 clone 方法,通过该方法来进行对象的拷贝,Java提供了一个Cloneable接口来标示这个对象是可拷贝的,当然有的对象是没有的如果我们想拷贝怎么办呢 ? 我们就只需要重写 clone 方法就可以啦!

二、原型模式的优点

1、性能优良

     原型模式是在内存二进制流的拷贝,要比直接 new 一个对象性能好很多,特别是要在一个循环体内产生大量的对象,原型模式可以更好的体现其优点。

2、逃避构建函数的约束

     它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的

     优点 : 就是减少了约束

     缺点 : 也是减少了约束

三、原型模式的使用场景

1、资源优化场景

   类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

2、性能和安全要求的场景

   通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

3、一个对象多个修改者的场景

   一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

四、原型模式的注意事项

1、构造函数不会被执行

2、深拷贝和浅拷贝

    深拷贝 :  对私有的类变量进行独立的拷贝

    浅拷贝 :  clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝

3、clone 和 final 两个关键字是有冲突的

 

代码 :

原型类

public class Prototype implements Cloneable {    
    
    public Object clone() throws CloneNotSupportedException {    
        Prototype proto = (Prototype) super.clone();    
        return proto;    
    }    
}   

一个复制的例子

    public class Prototype implements Cloneable, Serializable {    
        
        private static final long serialVersionUID = 1L;    
        private String string;    
        
        private SerializableObject obj;    
        
        /* 浅复制 */    
        public Object clone() throws CloneNotSupportedException {    
            Prototype proto = (Prototype) super.clone();    
            return proto;    
        }    
        
        /* 深复制 */    
        public Object deepClone() throws IOException, ClassNotFoundException {    
        
            /* 写入当前对象的二进制流 */    
            ByteArrayOutputStream bos = new ByteArrayOutputStream();    
            ObjectOutputStream oos = new ObjectOutputStream(bos);    
            oos.writeObject(this);    
        
            /* 读出二进制流产生的新对象 */    
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());    
            ObjectInputStream ois = new ObjectInputStream(bis);    
            return ois.readObject();    
        }    
        
        public String getString() {    
            return string;    
        }    
        
        public void setString(String string) {    
            this.string = string;    
        }    
        
        public SerializableObject getObj() {    
            return obj;    
        }    
        
        public void setObj(SerializableObject obj) {    
            this.obj = obj;    
        }    
        
    }    
        
    class SerializableObject implements Serializable {    
        private static final long serialVersionUID = 1L;    
    }    


通过以上的资料大家应该对原型模式有一个新的认识了吧 ! 有误的地方请指出 , 谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值