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

2017-02-25  本文已影响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方法,尤其是在深拷贝的场景,需要层层实现深拷贝。

(完)

上一篇 下一篇

猜你喜欢

热点阅读