标签:应该 资源 client 产生 eth start cli system 过程
(1)类初始化消耗资源较多。
(2)使用 new 生成一个对象需要非常繁琐的过程(数据准备、访问权限等)。
(3)构造函数比较复杂。
(4)在循环体中产生大量对象。
在 spring 中,原型模式应用的非常广泛。例如 scope="prototype" ,我们常用的JSON.oarseObject() 也是一种原型模式。
一个标准的原型模式代码应该这样设计,先创建一个 Prototype 接口
public interface Prototype { Prototype clone(); }
创建具体需要克隆的类 ConcretePrototypeA:
@Data public class ConcretePrototypeA implements Prototype { private int age; private String name; private List hobbies; @Override public Prototype clone() { ConcretePrototypeA concretePrototypeA = new ConcretePrototypeA(); concretePrototypeA.setAge(this.age); concretePrototypeA.setName(this.name); concretePrototypeA.setHobbies(this.hobbies); return concretePrototypeA; } }
创建 Client 类:
public class Client { private Prototype prototype; public Client(Prototype prototype){ this.prototype = prototype; } public Prototype startClone(Prototype concretePrototype){ return (Prototype)concretePrototype.clone(); } }
@Test void PrototypeTest(){ //创建一个具体的需要克隆的对象 ConcretePrototypeA concretePrototype = new ConcretePrototypeA(); //天成属性,方便测试 concretePrototype.setAge(18); concretePrototype.setName("prototype"); List hoobies = new ArrayList<String>(); concretePrototype.setHobbies(hoobies); System.out.println(concretePrototype); //创建client类准备克隆 Client client = new Client(concretePrototype); ConcretePrototypeA concretePrototypeClone = (ConcretePrototypeA)client.startClone(concretePrototype); System.out.println(concretePrototypeClone); System.out.println("克隆对象中的引用类型地址值:" + concretePrototypeClone.getHobbies()); System.out.println("原对象中的引用类型地址值:" + concretePrototype.getHobbies()); System.out.println("对象地址比较:" + (concretePrototype.getHobbies() == concretePrototypeClone.getHobbies())); }
从测试结果可以看出,hobbies 的引用地址是相同的,意味着赋值的不是指,而是引用的地址。这样的话,如果我们修改任意一个对象的属性值,则 concretePrototype 和 concretePrototypeClone 的 hobbies 的值都会改变,这就是我们常说的浅克隆。浅克隆只是完整复制了值类型数据,没有赋值引用对象。换言之,所有的应用对象仍然指向原来的对象,显然这不是我们想要的结果。
标签:应该 资源 client 产生 eth start cli system 过程
原文地址:https://www.cnblogs.com/xianquan/p/12864219.html