原型模式(Prototype Pattern)
2016-03-21 21:44
183 查看
原型模型:用于创建重复对象,同时保证性能。
这种模式实现一个原型接口,用于创建对象的克隆,当直接创建对象的代价比较大,则可以采用这种模式。例如:一个对象需要高代价的数据库操作之后被创建,这时可以缓存该对象,在下次请求时返回其克隆,不必在进行高代价的数据库操作。
下面将创建一个抽象类Pizza,再定义类PizzaCache,该类把Pizza对象存储在一个Hashtable中,并在请求的时候返回它们的克隆。
PrototypePatternDemo类使用PizzaCache来获取Pizza对象。
Pizza.java
CheesePizza.java
VeggiePizza.java
与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。
拷贝的两种方式:
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
上面的例子实现的是浅拷贝。
浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
这种模式实现一个原型接口,用于创建对象的克隆,当直接创建对象的代价比较大,则可以采用这种模式。例如:一个对象需要高代价的数据库操作之后被创建,这时可以缓存该对象,在下次请求时返回其克隆,不必在进行高代价的数据库操作。
下面将创建一个抽象类Pizza,再定义类PizzaCache,该类把Pizza对象存储在一个Hashtable中,并在请求的时候返回它们的克隆。
PrototypePatternDemo类使用PizzaCache来获取Pizza对象。
Pizza.java
public abstract class Pizza implements Cloneable { private String name; abstract void order(); public String getName() { return name; } public void setName(String name) { this.name = name; } public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
CheesePizza.java
public class CheesePizza extends Pizza { public CheesePizza() { name = "CheesePizza"; } public void order() { System.out.println("Book a CheesePizza"); } }
VeggiePizza.java
public class VeggiePizza extends Pizza { public VeggiePizza() { name = "VeggiePizza"; } public void order() { System.out.println("Book a VeggiePizza"); } }
public class PizzaCache { private static Hashtable<String, Pizza> PizzaMap = new Hashtable<String, Pizza>(); public static Pizza getPizza(String pizzaName) { Pizza cache = PizzaMap.get(pizzaName); return (Pizza) cache.clone(); } public static void loadCache() { CheesePizza cheesePizza = new CheesePizza(); PizzaMap.put(cheesePizza.getName(), cheesePizza); VeggiePizza veggiePizza = new VeggiePizza(); PizzaMap.put(veggiePizza.getName(), veggiePizza); } }
public class PrototypePatternDemo { public static void main(String[] args) { PizzaCache.loadCache(); Pizza pizza1 = (Pizza) PizzaCache.getPizza("CheesePizza"); System.out.println("Pizza:" + pizza1.getName()); Pizza pizza2 = (Pizza) PizzaCache.getPizza("VeggiePizza"); System.out.println("Pizza:" + pizza2.getName()); } }
与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。
拷贝的两种方式:
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
上面的例子实现的是浅拷贝。
浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
相关文章推荐
- 《构建之法》1、2、3章思考与感想
- 如何使用 Microsoft Azure Media Services 现场直播,(Live Streaming) 直播流媒体系统
- java学习笔记4--对象的初始化与回收
- Codeforces IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)
- 4-5章重点.doc
- 关于学习的态度——循序渐进
- CSS的width:100%和width:auto区别
- 树莓派3安装系统
- 2016年3月21日
- Apple官方文档翻译之iOS 文件管理系统
- 何时应该使用Directive、Controller、Service?
- java学习笔记3--类与对象的基础
- java学习笔记2--数据类型、数组
- ref和out的使用与区别
- (图文)在MyEclipse(2015)中上传项目到github的步骤(很详细)
- 6种排序大集合--由小到大,由大到小!
- STM8L HSE时钟配置
- 最好的简明NodeJS学习材料
- APPCAN学习笔记004---AppCan与Hybrid,appcan概述
- AppBuilder(四)SignatureConversions