设计模式之原型模式的学习思考
2017-06-26 16:15
381 查看
原型模式是设计模式里的创建型模式,通过对象来创建对象,一般通过克隆来实现。
克隆有浅克隆和深克隆之分:是对类内部对象引用的克隆程度
浅克隆后,新对象类的基本数值独立,但是克隆的对象引用只是地址,原对象改变,新克隆的对象也会改变;
深克隆,完全克隆,源对象的改变无论是基本数值还是对象引用都不会对新对象造成影响。
小例子:
浅拷贝:
输出:
深拷贝:
输出:
克隆有浅克隆和深克隆之分:是对类内部对象引用的克隆程度
浅克隆后,新对象类的基本数值独立,但是克隆的对象引用只是地址,原对象改变,新克隆的对象也会改变;
深克隆,完全克隆,源对象的改变无论是基本数值还是对象引用都不会对新对象造成影响。
小例子:
浅拷贝:
import java.util.ArrayList; import java.util.List; class People implements Cloneable{ private String name; private int age; private List<String> re; 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 List<String> getRe() { return re; } public void setRe(List<String> re) { this.re = re; } public People clone(){ try { return (People)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } } public class PrototypePattern { public static void main(String[] args) { People p1=new People(); p1.setName("ds"); p1.setAge(7); List<String> ll=new ArrayList<String>(); ll.add("呵呵"); p1.setRe(ll); People p2=p1.clone(); System.out.println(p1.getName()); System.out.println(p1.getRe()); System.out.println(p2.getName()); System.out.println(p2.getRe()); p1.setName("dsds"); ll.add("呵呵呵呵"); System.out.println(p2.getName()); // p2基本数据没有改变 System.out.println(p2.getRe()); // p2内部对象引用改变 } }
输出:
ds [呵呵] ds [呵呵] ds [呵呵, 呵呵呵呵]
深拷贝:
import java.util.ArrayList; import java.util.List; class People implements Cloneable{ private String name; private int age; private List<String> re; 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 List<String> getRe() { return re; } public void setRe(List<String> re) { this.re = re; } public People clone(){ try { People person=(People)super.clone(); List<String> newre=new ArrayList<String>(); for(String r:newre){ newre.add(r); } person.setRe(newre); return person; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } } public class PrototypePattern { public static void main(String[] args) { People p1=new People(); List<String> ll=new ArrayList<String>(); ll.add("哦哦"); p1.setRe(ll); People p2=p1.clone(); System.out.println(p1.getRe()); System.out.println(p2.getRe()); } }
输出:
[哦哦] []
相关文章推荐
- 设计模式学习笔记(四)——Prototype原型
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习总结4 - 创建型4 - Prototype原型模式
- 设计模式学习-每日一记(6.原型模式)
- 我对设计模式的学习和实践的思考...
- java 设计模式学习笔记(8) - 原型模式
- 步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)
- 设计模式学习-Prototype(原型)
- 步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)
- HeadFirst 设计模式学习笔记19--原型(Prototype)模式拾零
- 【设计模式学习笔记1】原型法
- 阿Sam的设计模式学习笔记---- 原型(Prototype)模式
- C#面向对象设计模式学习笔记(5) - Prototype 原型模式(创建型模式)
- 设计模式学习(四)原型模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习笔记之原型模式
- 设计模式学习笔记--Prototype原型模式
- 设计模式学习笔记-原型模式
- “设计模式”学习之二:单件、原型与生成器模式