美文网首页
设计模式[4]-原型模式-Prototype Pattern

设计模式[4]-原型模式-Prototype Pattern

作者: 郭寻抚 | 来源:发表于2017-02-25 20:56 被阅读69次

    1. 原型模式简介

    原型模式(Prototype Pattern)是创建型设计模式,根据一个原型对象,通过Clone的方式,创建出一个新的对象。

    Java的原型模式特别简单,一个类只需要实现Cloneable接口,并且重写(Override)Object类中clone方法。

    2. 原型模式举例

    原型类 Person

    /**
     * 在java虚拟机中,只有实现Cloneable接口的类才可以被拷贝,
     * 否则在运行时会抛出CloneNotSupportedException异常。
     */
    public class Person implements Cloneable{
    
        private int age;
    
        public Person(int age) {
            this.age = age;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
        // 浅拷贝
        @Override
        public Person clone(){
            Person person = null;
            try {
                person = (Person)super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return person;
        }
    }
    

    客户端类

    public class PrototypeMain {
    
        public static void main(String[] args) {
            Person person = new Person("张三", 18);
            // 克隆过后,可以修改克隆的对象,变成你想要的对象
            Person copy = person.clone();
            // person 和 copy 这2个对象的内存地址不相等。
            System.out.println(person == copy);
        }
    }
    

    3. 关于Clone

    Java的世界里,创建对象的方式包括:使用new操作符、反序列化、通过反射的newInstance方法和Clone方式。

    关于Clone,需要注意的是,Clone方式创建实例对象,不会调用类的构造器,不论构造器的访问权限是public还是private,因此,如果单例模式类没有通过手段防备,其对象也可能被clone出来。

    Clone要注意深拷贝和浅拷贝的问题。Object类的clone方法只会拷贝对象中8种基本数据类型和它们的封装类,对于其它类型(对于数组、容器对象、引用对象)的对象,只会拷贝其引用,是为浅拷贝。例如Person类里有一个Phone类的属性,现在有个Person对象A,拷贝出对象B,B中的Phone和A中的Phone是同一个,修改了其中一个,就会影响另一个。如果要实现深拷贝,就需要在clone方法里自己实现深拷贝。

    @Override
    public Person clone(){
        Person person = null;
        try {
            person = (Person)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        // 深拷贝
        person.phone = (Phone)phone.clone();
        return person;
    }
    

    4. 原型模式总结

    Clone的方式创建对象,比通过new创建对象的效率要高;因此原型模式适合创建对象成本较高的场景。

    原型模式需要为类编写clone方法,尤其是在深拷贝的场景,需要层层实现深拷贝。

    (完)

    相关文章

      网友评论

          本文标题:设计模式[4]-原型模式-Prototype Pattern

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