码迷,mamicode.com
首页 > 其他好文 > 详细

原型模式

时间:2020-05-10 19:16:19      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:应该   资源   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!