原型模式
来源:互联网 发布:知乎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=[编程, 读书]]
原型模式的特点
- 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身
- 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值
- 根据对象克隆的深度层次不同 ,有浅度克隆与深度克隆
阅读全文
0 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 可变参数
- 1050. String Subtraction 解析
- bzoj2906 颜色 分块
- HFOI2017.7.13校内赛(普及组)题解
- MATLAB基本语法
- 原型模式
- centos下安装运行PowerGraph
- 继续码
- javascript基础_04
- HDU1257—最少拦截系统
- 求赋权图中一个结点到所有结点的最短路径的长度
- Linux C 执行shell命令并获取返回结果
- Spark运行架构
- 1051. Pop Sequence 解析