设计模式---原型模式

定义:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对 象。)

 

         这个程序是否有问题?Look here,这是一个 线程在运行,也就是你发送的是单线程的,那按照一封邮件发出去需要0.02秒(够小了,你 还要到数据库中取数据呢),600万封邮件需要33个小时。如何解决这个问题?好办,把sendMail修改为多线程,但是只把sendMail修改为多线程还是有问题的呀,产 生第一封邮件对象,放到线程1中运行,还没有发送出去;线程2也启动了,直接就把邮件对 象mail的收件人地址和称谓修改掉了,线程不安全了。说到这里,你会说这有N多种解决办 法,其中一种是使用一种新型模式来解决这个问题:通过对象的复制功能来解决这个问题。

 

运行结果不变,一样完成了电子广告信的发送功能,而且sendMail即使是多线程也没有 关系。注意,看Client类中的粗体字mail.clone()这个方法,把对象复制一份,产生一个新的 对象,和原有对象一样,然后再修改细节的数据,如设置称谓、设置收件人地址等。这种不 通过new关键字来产生一个对象,而是通过对象复制来实现的模式就叫做原型模式。

原型模式的优点

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

        逃避构造函数的约束 这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的(参见13.4 节)。优点就是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。

使用场景

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

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

        一个对象多个修改者的场景 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑 使用原型模式拷贝多个对象供调用者使用。 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的 方法创建一个对象,然后由工厂方法提供给调用者。

注意事项:

1、拷贝对象构造方法不会被执行

 

浅拷贝

 

 Object类提供 的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象 的内部元素地址,这种拷贝就叫做浅拷贝。确实是非常浅,两个对象共享了一个私有变量, 你改我改大家都能改,是一种非常不安全的方式。内部的数组和引用对象才不拷贝, 其他的原始类型比如int、long、char等都会被拷贝,但是对于String类型,Java就希望你把它 认为是基本类型,它是没有clone方法的

 

深拷贝

 该方法就实现了完全的拷贝,两个对象之间没有任何的瓜葛了,你修改你的,我修改我 的,不相互影响,这种拷贝就叫做深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值