美文网首页
Android设计模式:原型设计模式

Android设计模式:原型设计模式

作者: kjy_112233 | 来源:发表于2018-09-26 15:22 被阅读0次
    • 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

    (1)原型模式实现

    • 实现Cloneable接口;重写Object的clone方法实现拷贝逻辑
    public class Person implements Cloneable {
        private int age;
        private boolean sex;
        private String name;
    
        @Override
        public Object clone() {
            Person person;
            try {
                person = (Person) super.clone();
                person.age = this.age;
                person.sex = this.sex;
                person.name = this.name;
                return person;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public boolean isSex() {
            return sex;
        }
    
        public void setSex(boolean sex) {
            this.sex = sex;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @NonNull
        @Override
        public String toString() {
            return "Person{" + "name='" + name + ", sex=" + sex + ", age=" + age + '}';
        }
    }
    
    • 在代码中调用
            Person person = new Person();
            person.setName("小李");
            person.setSex(true);
            person.setAge(22);
            System.out.println(person);
            Person person1 = (Person) person.clone();
            System.out.println(person1);
            person1.setName("小张");
            System.out.println(person);
            System.out.println(person1);
    
    • 当Person类里还有一个属性叫兴趣爱好,是一个List集合,在进行拷贝的时候要格外注意。
        @Override
        public Object clone() {
            Person person = null;
            try {
                person = (Person) super.clone();
                person.name = this.name;
                person.sex = this.sex;
                person.age = this.age;
                person.height = this.height;
                person.hobbies = this.hobbies;
                return person;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    • 拷贝后会出现修改集合数据时所有对象的集合都被修改。
    • 导致这个问题的原因是我们只进行了浅拷贝,也就是只拷贝了引用,最终两个对象指向的引用是同一个,一个发生变化另一个也会发生变换。
    • List使用深拷贝方法解决
        @Override
        public Object clone() {
            Person person = null;
            try {
                person = (Person) super.clone();
                person.name = this.name;
                person.sex = this.sex;
                person.age = this.age;
                person.height = this.height;
                person.hobbies = (ArrayList<String>) this.hobbies.clone();
                return person;
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    优点

    • 使用原型模型创建一个对象比直接new一个对象更有效率,因为它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
    • 隐藏了制造新实例的复杂性,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

    缺点

    • 由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用,因为原型类需要将clone方法的作用域修改为public类型,那么单例模式的条件就无法满足了。
    • 使用原型模式时不能有final对象。
    • Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。这里涉及到深拷贝和浅拷贝的概念。

    相关文章

      网友评论

          本文标题:Android设计模式:原型设计模式

          本文链接:https://www.haomeiwen.com/subject/lygdoftx.html