原型模式

用一个已经创建的实例作为原型,通过复制这个原型对象来创建一个和原型一样的新对象。

原型模式包含如下角色:

  • Prototype: 抽象原型类,声明克隆方法。
  • ConcretePrototype: 具体原型类,实现克隆方法。
  • Client: 客户类,使用具体原型类中的克隆方法创建一个新的对象。

Java 中的 Object 类提供了一个 clone() 方法,可以将一个对象复制一份,但是需要实现 Cloneable 接口。Cloneable 接口就是一个抽象原型类,而实现了这个接口的类就是具体原型类。

public class User implements Cloneable {

    private String userName;
    private String password;


    @Override
    public User clone() {
        try {
            return (User) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

    public static void main(String[] args) {
        User user = new User();
        user.userName = "daijunfeng";
        System.out.println(user.clone() == user);
    }
}

原型模式适用于创建重复的对象,同时又能保证性能,它提供了一种创建对象的最佳方式。优点是简化对象的创建过程,通过克隆的方式创建对象,而不是通过 new 关键字。缺点是需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了开闭原则。

原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可以使程序运行更高效。

需要注意的是,克隆是浅拷贝,如果需要深拷贝需要额外处理。