设计模式-创建型模式-原型模式

167 阅读2分钟

原型模式定义

原型模式 Prototype Pattern 是创建型模式的一种。用于创建重复对象,同时具备良好的性能。该模式创建了一个原型接口,该接口用于创建对象的克隆。当直接创建对象代价很大时候,使用原型模式。

注意事项

原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

主要解决

在运行期建立和删除原型。

何时使用

1、当一个系统应该独立于它的产品创建,构成和表示时。

2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。

3、为了避免创建一个与产品类层次平行的工厂类层次时。

4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决

利用已有的一个原型对象,快速地生成和原型对象一样的实例。

应用实例

1、细胞分裂。

2、JAVA 中的 Object clone() 方法。

优点

1、性能提高。

2、逃避构造函数的约束。

缺点

1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

2、必须实现 Cloneable 接口。

克隆对象应用

克隆用户对象,设计原型类继承克隆接口,创建原型类的子类构造对象。客户端调用子类即可。

image.png

代码

用户对象

@Data
public class User {
    private String username;
    private String password;
    private LocalDateTime birth;
}

原型接口设计,子类构建原型接口

public class Prototype implements Cloneable{
    private User user;

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Prototype{" +
                "user=" + user +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class ConcretePrototype extends Prototype{
    public ConcretePrototype(User user) {
        setUser(user);
    }

}

客户端使用,执行的是浅拷贝。

public class PrototypeClient {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype p1 = new ConcretePrototype(new User("a","a", LocalDateTime.now()));
        Prototype p2 = (Prototype) p1.clone();
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p1.equals(p2));
    }
}