原型模式就是将对象复制一份,分为浅克隆和深克隆
一、要点
1、必须实现Cloneable接口才能实现克隆
2、浅克隆只克隆对象对象引用,不克隆成员变量对象的引用。
3、深克隆不仅仅会克隆引用,而且会克隆成员变量对象的引用,克隆成一个新的引用。
image.png
4、Spring框架的beans 就是单例模式或者原型模式实现的。
5、实现cloneable的接口一般是实现浅克隆
二、实例
public class Test implements Cloneable{
//某对象
private T t;
//get和set方法
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
//浅克隆
@Override
protected Object clone() throws CloneNotSupportedException {
//直接调用Object对象的clone方法
Object obj = super.clone();
return obj;
}
//深克隆
protected Object clone1() throws CloneNotSupportedException {
//直接调用Object对象的clone方法
Test obj = (Test) super.clone();
//clone 成员变量对象引用
obj.t= (T)t.clone();
return obj;
}
public static void main(String[] args) throws CloneNotSupportedException {
Test test = new Test();
test.setT(new T());
//浅克隆
Test test1 = (Test) test.clone();
System.out.println("浅--克隆下对象引用被复制:"+test.hashCode() +" "+ test1.hashCode());
System.out.println("浅--克隆下成员对象引用不被复制:"+test1.getT().hashCode()+" "+test.getT().hashCode());
//深克隆
Test test2 = (Test)test.clone1();
System.out.println("深++克隆下对象引用被复制:"+test.hashCode() +" "+ test2.hashCode());
System.out.println("深++克隆下成员对象引用被复制:"+test2.getT().hashCode()+" "+test.getT().hashCode());
}
}
三、其他(网上整理)
原型模式的优缺点:
优点:(1):当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。
(2):扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,而将具体原型类写到配置文件中,增减或减少产品对原有系统都没有影响。
(3):原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,圆形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。
(4):可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
缺点:(1):需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
(2):在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。
原型模式的适用环境:
1:创建新对象成本较大(例如初始化时间长,占用CPU多或占太多网络资源),新对象可以通过复制已有对象来获得,如果相似对象,则可以对其成员变量稍作修改。
2:系统要保存对象的状态,而对象的状态很小。
3:需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的组合状态,通过复制原型对象得到新实例可以比使用构造函数创建一个新实例更加方便。
网友评论