设计模式之原型模式
原型模式
简介
原型模式是一个创建型模式。原型模式使用原型实例指定创建对象的种类,并且通过拷贝原型对象创建新的对象。
为什么需要原型模式
1.为什么不用new直接新建对象,而要用原型模式?
首先,用new新建对象不能获取当前对象运行时的状态,其次就算new了新对象,在将当前对象的值复制给新对象,效率也不如原型模式高。
2.为什么不直接使用拷贝构造函数,而使用原型模式?
原型模式与拷贝构造函数是不同的概念,拷贝构造函数涉及的类是已知的,原型模式涉及的类可以是未知的(基类的拷贝构造函数只能复制得到基类的对象)。
原型模式生成的新对象可能是一个派生类。拷贝构造函数生成的新对象只能是类本身。原型模式是描述了一个通用方法(或概念),它不管是如何实现的,而拷贝构造则是描述了一个具体实现方法。
原型模式优缺点
优点:
1.原新模式对客户隐藏了具体的产品类。
2.原型模式是在内存中二进制流的拷贝,要比直接new一共对象性能好很多,特别是要在一共循环体内产生大量对象时,原型模式可能更好的体现其优点。
3.还有一个重要的用途就是保护性拷贝,也就是对某个对象对外可能是只读的,为了防止外部对这个只读对象的修改,通常可以通过返回一共对象拷贝的形式实现只读的限制。
缺点:
1.这个既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发中应该注意这个潜在问题。优点是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。
2.通过实现Cloneable接口的原型模式在调用clone函数构造实例时并不一定比通过new操作速度快,只有当通过new构造对象较为耗时或者说成本较高时,通过clone方法才能够获得效率上的提升。
Java浅克隆和深克隆
代码实战
创建实体Student,再实体中实现Cloneable与Serializable接口。并写入深克隆与浅克隆两个方法。
public class Student implements Cloneable,Serializable {
private String name;
private int age;
private Teacher teacher;
//浅克隆
public Object clone(){
Object obj = null;
try{
obj = super.clone();
}catch (Exception e){
e.printStackTrace();
return null;