原型模式

来源:互联网 发布:势不可挡网络剧预告片 编辑:程序博客网 时间:2024/06/07 15:41

定义

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

优点

  • 性能提高
  • 避免构造函数的约束

缺点

  • 配备克隆方法,需要对类的功能进行通盘考虑
  • 必须继承Cloneable接口
  • 避免构造函数的约束

注意事项

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

第一步(最简单的)

public class Person implements Cloneable{    private String name;    private int age;    private double height;    private double weight;    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 double getHeight() {        return height;    }    public void setHeight(double height) {        this.height = height;    }    public double getWeight() {        return weight;    }    public void setWeight(double weight) {        this.weight = weight;    }    @Override    public String toString() {        return "Person : " + "name -- " + name + ",age -- " + age + ",height -- " + height + ",weight -- " + weight;    }    @Override    protected Object clone() throws CloneNotSupportedException {        Person person = null;        person = (Person)super.clone();        person.name = this.name;        person.age = this.age;        person.height = this.height;        person.weight = this.weight;        return person;    }}

第二步(最简单的)

public class PrototypDemo {    public static void main(String[] args) throws CloneNotSupportedException {        Person p = new Person();        p.setName("张三");        p.setAge(18);        p.setHeight(175d);        p.setWeight(75d);        System.out.println("最初的数据:");        System.out.println(p);        Person p1 = (Person) p.clone();        System.out.println("第一次clone之后的数据:" );        System.out.println(p1);        p1.setName("李四");        System.out.println("clone之后的第一次的数据:" );        System.out.println(p);        System.out.println("clone之后修改后的数据:");        System.out.println(p1);    }}

收获结果

最初的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0第一次clone之后的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0clone之后的第一次的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0clone之后修改后的数据:Person : name -- 李四,age -- 18,height -- 175.0,weight -- 75.0

第一步(Person类增加list)

private ArrayList<String> hobbies = new ArrayList<>();public ArrayList<String> getHobbies() {    return hobbies;}public void setHobbies(ArrayList<String> hobbies) {    this.hobbies = hobbies;}protected Object clone() throws CloneNotSupportedException {        Person person = null;        person = (Person)super.clone();        person.name = this.name;        person.age = this.age;        person.height = this.height;        person.weight = this.weight;        person.hobbies = (ArrayList<String>) this.hobbies.clone();        return person;    }

第二步(验证)

public class PrototypDemo {    public static void main(String[] args) throws CloneNotSupportedException {        Person p = new Person();        p.setName("张三");        p.setAge(18);        p.setHeight(175d);        p.setWeight(75d);        ArrayList<String> hobbies = new ArrayList<>();        hobbies.add("敲代码");        hobbies.add("编程");        p.setHobbies(hobbies);        System.out.println("最初的数据:");        System.out.println(p);        Person p1 = (Person) p.clone();        System.out.println("第一次clone之后的数据:" );        System.out.println(p1);        p1.setName("李四");        p1.getHobbies().add("睡觉");        System.out.println("clone之后的第一次的数据:");        System.out.println(p);        System.out.println("clone之后修改后的数据:");        System.out.println(p1);    }}

查看结果

最初的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,第一次clone之后的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,clone之后的第一次的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,clone之后修改后的数据:Person : name -- 李四,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,睡觉,