设计模式(四)原型模式(创建型)
来源:互联网 发布:数控编程工程师 编辑:程序博客网 时间:2024/04/29 22:48
定义:通过拷贝一个已经存在的实例来返回新的实例,而不是新建实例。被拷贝的实例就称为原型。
类图
原型类实现思路
(1)实现Cloneable接口。(在Java虚拟机中,只有实现了这个接口的类才可以被拷贝。)
(2)重写Object类中的clone方法。(作用是返回对象的一个拷贝,但其作用域是protected,要修改成public。)
原型模式中的拷贝分为“浅拷贝”和“深拷贝”。
浅拷贝
对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用、不复制引用的对象。
深拷贝
对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。
Object类的clone方法只会拷贝对象中的基本的数据类型,对于String类型、数组、容器对象、引用对象等都不会拷贝。如果要实现深拷贝,必须对String类型、数组、容器对象、引用对象等另行拷贝。Java提供的大部分容器类都实现了Cloneable接口。
例子
原型类
public class Prototype implements Cloneable{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public Prototype clone(){Prototype prototype = null;try{ prototype = (Prototype)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return prototype;}}
public class LightPrototype extends Prototype{public void display(){System.out.println(this.getName());}}
测试类
public class LightPrototypeTest {public static void main(String[] args){LightPrototype lightPrototype = new LightPrototype();lightPrototype.setName("original lightPrototype!");LightPrototype copyLightPrototypePrototype = (LightPrototype)lightPrototype.clone();System.out.println(copyLightPrototypePrototype.getName());}}
public class DeepPrototype implements Cloneable{private String id;private Prototype prototype;public String getId() {return id;}public void setId(String id) {this.id = id;}public Prototype getPrototype() {return prototype;}public void setPrototype(Prototype prototype) {this.prototype = prototype;}@Overridepublic DeepPrototype clone(){DeepPrototype deepPrototype = null;try{ deepPrototype = (DeepPrototype)super.clone(); //对引用对象的拷贝deepPrototype.prototype = (Prototype)this.prototype.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return deepPrototype;}}
测试类
public class DeepPrototypeTest {public static void main(String[] args){Prototype prototype = new Prototype();prototype.setName("original Prototype!");DeepPrototype deepPrototype = new DeepPrototype();deepPrototype.setId("deepPrototype id!");deepPrototype.setPrototype(prototype);DeepPrototype copyDeepPrototypePrototype = (DeepPrototype)deepPrototype.clone();System.out.println(copyDeepPrototypePrototype.getId());System.out.println(copyDeepPrototypePrototype.getPrototype().getName());}}
0 0
- 设计模式(四)原型模式Prototype(创建型)
- 设计模式(四)原型模式Prototype(创建型)
- 设计模式(四)原型模式Prototype(创建型)
- 设计模式(四)原型模式(Prototype)-创建型
- 设计模式(四)原型模式Prototype(创建型)
- 设计模式(四)原型模式(创建型)
- 四、原型模式Prototype(创建型)
- 设计模式--创建型模式--原型模式(Protype Pattern)
- 设计模式中创建型模式 (二):原型模式
- 设计模式:创建型模式:原型模式(prototype pattern)
- (4)设计模式之原型模式(创建型模式)
- C#设计模式(四)原型模式
- java设计模式(四)---原型模式
- C++ 设计模式(四)----原型模式
- 设计模式笔记--创建型模式之四--原型prototype
- 原型模式——创建型设计模式四
- 设计模式(2)-创建型-原型模式(Prototype)
- 【设计模式】—-(5)原型模式(创建型)
- Assert python使用小结
- IOS开发遇到的问题
- Volley使用简介
- IntelliJ IDEA2016.2 + maven 创建java web 项目
- jemter之正则表达式提取
- 设计模式(四)原型模式(创建型)
- 【编程 C】 对C语言编译初级算法的一些心得---函数(1)
- 解决:Generation aborted due to errors detected during the verification of the model.
- HTTP Content-type 列表
- DTD分析与总结(根据struts2的dtd文件)
- python编码(str和unicode)
- Windows平台 Code::Blocks-16.01安装入门教程
- 第五周 项目4 数值转换
- Junit4 with Intellij Idea and Maven