原型模式

创立型模式

这种模式是实现了一个原型接口,该接口用于创立以后对象的克隆。当间接创建对象的代价比拟大时,则采纳这种模式。例如,一个对象须要在一个高代价的数据库操作之后被创立。咱们能够缓存该对象,在下一个申请时返回它的克隆,在须要的时候更新数据库,以此来缩小数据库调用。

介绍

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

次要解决: 在运行期建设和删除原型。

何时应用: 1、当一个零碎应该独立于它的产品创立,形成和示意时。 2、当要实例化的类是在运行时刻指定时,例如,通过动静装载。 3、为了防止创立一个与产品类档次平行的工厂类档次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建设相应数目的原型并克隆它们可能比每次用适合的状态手工实例化该类更不便一些。

如何解决: 利用已有的一个原型对象,疾速地生成和原型对象一样的实例。

要害代码: 实现克隆操作,继承 Cloneable,重写 clone() 。

具体实现

public class Sheep implements Cloneable {    private String name;    private int age;    private String color;    public Sheep(String name, int age, String color) {        this.name = name;        this.age = age;        this.color = color;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    @Override    public String toString() {        return "Sheep{" +                "name='" + name + '\'' +                ", age=" + age +                ", color='" + color + '\'' +                '}';    }    //克隆该实例,重写clone来实现    @Override    protected Sheep clone() {        Sheep sheep = null;        try {            sheep = (Sheep) super.clone();        } catch (Exception e) {            System.out.println(e.getMessage());        }        return sheep;    }}
public class Client {    public static void main(String[] args){        Sheep sheep = new Sheep("Jack",18,"red");        Sheep sheep1 = sheep.clone();        Sheep sheep2 = sheep.clone();        System.out.println(sheep == sheep1); //false        System.out.println(sheep1 == sheep2); //false    }}

留神

该克隆模式是浅拷贝,如果你的类中蕴含对象属性的话,克隆进去的对象的属性都会援用同一个地址。如果须要其对象属性也不雷同的话须要应用实现 Serializable 读取二进制流来实现深拷贝

总结

长处: 1、性能进步。 2、回避构造函数的束缚。

毛病: 1、装备克隆办法须要对类的性能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不肯定很容易,特地当一个类援用不反对串行化的间接对象,或者援用含有循环构造的时候。 2、必须实现 Cloneable 接口。