构造型模式之Prototype(原型)模式
2016-04-08 17:11
302 查看
1.如果你期望根据给定的例子创建一个对象,可使用Prototype(原型)模式
2.区分Shallow Clone&Deep Clone
Shallow Clone: 对基本类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
Deep Clone: 对基本类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
参考:http://blog.csdn.net/shootyou/article/details/3945221
3.举例
4.总结:Prototype(原型)模式不通过实例化类来创建一个新的未初始化的实例,而是通过复制一个现有对象来生成新的对象。该模式要注意Shallow Clone与Deep Clone的区别,否则会造成原来实例化对象数据被修改而造成逻辑错误。
2.区分Shallow Clone&Deep Clone
Shallow Clone: 对基本类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
Deep Clone: 对基本类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
参考:http://blog.csdn.net/shootyou/article/details/3945221
3.举例
//第一个原型类:clone()方法包括了Shallow Clone与Deep Clone的实现 public class FirstPrototype implements Cloneable{ private String name; private SecondPrototype secondPrototype; public String getName() { return name; } public void setName(String name) { this.name = name; } public SecondPrototype getSecondPrototype() { return secondPrototype; } public void setSecondPrototype(SecondPrototype secondPrototype) { this.secondPrototype = secondPrototype; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub //Shallow Clone //return super.clone(); //Deep Clone FirstPrototype clone = (FirstPrototype) super.clone(); clone.setSecondPrototype((SecondPrototype) secondPrototype.clone()); return clone; } }
//第二个原型类:该类没有引用类型的成员变量 public class SecondPrototype implements Cloneable{ private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } }
//测试类 public class Test { public static void main(String[] args){ SecondPrototype sp0 = new SecondPrototype(); sp0.setAge(0); FirstPrototype fp0 = new FirstPrototype(); fp0.setName("fp0"); fp0.setSecondPrototype(sp0); System.out.println(fp0.getName()); System.out.println(fp0.getSecondPrototype().getAge()); try { FirstPrototype fp1 = (FirstPrototype) fp0.clone(); fp1.setName("fp1"); fp1.getSecondPrototype().setAge(1); System.out.println("clone: " + fp1.getName()); System.out.println("clone: " + fp1.getSecondPrototype().getAge()); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(fp0.getName()); System.out.println(fp0.getSecondPrototype().getAge()); } }
//Shallow Clone结果 fp0 0 clone: fp1 clone: 1 fp0 1 //Deep Clone结果 fp0 0 clone: fp1 clone: 1 fp0 0
4.总结:Prototype(原型)模式不通过实例化类来创建一个新的未初始化的实例,而是通过复制一个现有对象来生成新的对象。该模式要注意Shallow Clone与Deep Clone的区别,否则会造成原来实例化对象数据被修改而造成逻辑错误。
相关文章推荐
- javascript 原型模式实现OOP的再研究
- 实例讲解C++编程中对设计模式中的原型模式的使用
- C++设计模式之原型模式
- javascript原型模式用法实例详解
- JavaScript设计模式之原型模式(Object.create与prototype)介绍
- 浅析php原型模式
- php示例详解Constructor Prototype Pattern 原型模式
- 学习php设计模式 php实现原型模式(prototype)
- Java设计模式之原型模式(Prototype模式)介绍
- 深入理解JavaScript系列(42):设计模式之原型模式详解
- 原型模式
- Prototype 原型模式
- Java设计模式 创建模式-原型模式(Prototype)
- JavaScript 原型模式的理解
- 原型模式
- 设计模式--浅谈原型模式
- java设计模式学习笔记-原型模式
- 设计模式学习笔记——原型模式
- 原型模式
- 设计模式 - 创建型模式 - 原型模式