原型模式

来源:互联网 发布:知乎wifi不能用 编辑:程序博客网 时间:2024/05/20 05:22

原型莫模式(创建型模式)

Prototype模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用Prototype模式来创建的实例,具有与原型一样的数据。

要使一个对象能被克隆,首先他的类得先实现Cloneable接口,再重写clone方法。其实Clonable接口什么都没做,只是标识了这个类的对象能被克隆。

People类
实现了Cloneable接口,重写了clone方法

public class People implements Cloneable {    private String name;    private Integer age;    private Character sex;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Character getSex() {        return sex;    }    public void setSex(Character sex) {        this.sex = sex;    }    @Override    public String toString() {        return "Prototype [name=" + name + ", age=" + age + ", sex=" + sex                + "]";    }    @Override     public People clone() {        try {            return (People) super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();            return null;        }    }}

Test测试

public class Test {    public static void main(String[] args) {        People p1 = new People();        p1.setName("hello");        p1.setAge(0);        p1.setSex('女');        People p2 = p1.clone();        System.out.println("p1:" + p1);        System.out.println("p2:" + p2);    }}

结果

p1:Prototype [name=hello, age=0, sex=女]p2:Prototype [name=hello, age=0, sex=女]

克隆分为浅克隆与深度克隆

上面的People就是一种浅克隆,如果People对象中有一个引用类型的属性,则克隆出来的对象会指向同一个对象

向People加入List属性

public class People implements Cloneable {    private String name;    private Integer age;    private Character sex;    private List<String> habits;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Character getSex() {        return sex;    }    public void setSex(Character sex) {        this.sex = sex;    }    public List<String> getHabits() {        return habits;    }    public void setHabits(List<String> habits) {        this.habits = habits;    }    @Override     public People clone() {        try {            return (People) super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();            return null;        }    }    @Override    public String toString() {        return "People [name=" + name + ", age=" + age + ", sex=" + sex                + ", habits=" + habits + "]";    }}

Test测试

public class Test {    public static void main(String[] args) {        List<String> habits = new ArrayList<String>();        habits.add("编程");        habits.add("读书");        People p1 = new People();        p1.setName("hello");        p1.setAge(0);        p1.setSex('女');        p1.setHabits(habits);        People p2 = p1.clone();        System.out.println("p1:" + p1);        System.out.println("p2:" + p2);        p1.getHabits().add("乒乓球");        System.out.println("p1:" + p1);        System.out.println("p2:" + p2);    }}

结果

p1:People [name=hello, age=0, sex=女, habits=[编程, 读书]]p2:People [name=hello, age=0, sex=女, habits=[编程, 读书]]p1:People [name=hello, age=0, sex=女, habits=[编程, 读书, 乒乓球]]p2:People [name=hello, age=0, sex=女, habits=[编程, 读书, 乒乓球]]

两个People的habits都指向了同一个List

如果想深度克隆的话,就得重写clone方法,单独处理引用类型的属性

clone方法

@Override public People clone() {    try {        List<String> list = new ArrayList<String>();        for (String habit : this.habits) {            list.add(habit);        }        People people = (People) super.clone();        people.setHabits(list);                         return people;    } catch (CloneNotSupportedException e) {        e.printStackTrace();        return null;    }}

Test方法不变

结果

p1:People [name=hello, age=0, sex=女, habits=[编程, 读书]]p2:People [name=hello, age=0, sex=女, habits=[编程, 读书]]p1:People [name=hello, age=0, sex=女, habits=[编程, 读书, 乒乓球]]p2:People [name=hello, age=0, sex=女, habits=[编程, 读书]]

原型模式的特点

  1. 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身
  2. 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值
  3. 根据对象克隆的深度层次不同 ,有浅度克隆与深度克隆
原创粉丝点击