原型模式

原型模式

使命

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

优点
  • 性能提高
  • 逃避构造函数的约束
缺点
  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候
  • 必须实现 Cloneable 接口

克隆羊多莉的故事,想必都听过了吧,原型模式其实主要思想就是实现 Cloneable 接口,实现实例对象的克隆,从而实现高效的对象创建,但是这个高效并不是所有效率都高于直接创建,当创建代价较大才采用这种方式会比较合适

绵羊
public class Sheep implements Cloneable {
private String name;
private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Sheep(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() {
        Object o = null;
        try {
            o = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }

    @Override
    public String toString() {
        return "name:" + name + " age:" + age;
    }
}

开始克隆

public static void main(String[] args) {
    Sheep sheep = new Sheep("A", 3);
    Sheep dolly = (Sheep) sheep.clone();
    dolly.setName("Dolly");
    dolly.setAge(1);
    System.out.println(sheep);
    System.out.println(dolly);
}

核心思想很简单,但是不要滥用这种方式来创建实例,优点缺点以及它要解决的目的掌握之后才能更好地使用这张牌