技术开发 频道

原型模式之实战个性化电子账单

  原型模式的优点

  1.性能优良

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

  2.逃避构造函数的约束

  这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的(见“原型模式的注意事项”),优点就是减少了约束,缺点也是减少了约束,双刃剑,需要大家在实际应用时考虑。

  原型模式的使用场景

  1.资源优化场景

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

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

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

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

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

  在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与Java融为浑然一体,大家可以随手拿来使用。

  原型模式的注意事项

  原型模式虽然很简单,但是在Java中使用原型模式也就是clone方法还是有一些注意事项的,我们通过几个例子一个一个解说(如果你对Java不是很感冒的话,可以跳开以下部分)。

  构造函数不会被执行

  一个实现了Cloneable并重写了clone方法的类A,有一个无参构造或有参构造B,通过new关键字产生了一个对象S,再然后通过S.clone()方式产生了一个新的对象T,那么在对象拷贝时构造函数B是不会被执行的,我们来写一小段程序来说明这个问题,如代码清单13-8所示。

  代码清13-8 简单的可拷贝对象

public class Thing implements Cloneable{
    
public Thing(){
        System.out.println(
"构造函数被执行了...");
    }
    
    @Override
    
public Thing clone(){
        Thing thing
=null;
        
try {
            thing
= (Thing)super.clone();
        }
catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        
return thing;
    }
}

  然后我们再来写一个Client类,进行对象的拷贝,如代码清单13-9所示。

  代码清13-9 简单的场景类

public class Client {

    
public static void main(String[] args) {
        
//产生一个对象
        Thing thing = new Thing();        
        
//拷贝一个对象
        Thing cloneThing = thing.clone();
    }
}

  运行结果如下所示。

构造函数被执行了...

  对象拷贝时构造函数确实没有被执行,这点从原理来讲也是可以讲得通的,Object类的clone方法的原理是从内存中(具体的说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了。

0
相关文章