原型模型:用于创建重复对象,同时保证性能。

这种模式实现一个原型接口,用于创建对象的克隆,当直接创建对象的代价比较大,则可以采用这种模式。例如:一个对象需要高代价的数据库操作之后被创建,这时可以缓存该对象,在下次请求时返回其克隆,不必在进行高代价的数据库操作。

下面将创建一个抽象类Pizza,再定义类PizzaCache,该类把Pizza对象存储在一个Hashtable中,并在请求的时候返回它们的克隆。

PrototypePatternDemo类使用PizzaCache来获取Pizza对象。

Pizza.java

  1. public abstract class Pizza implements Cloneable {
  2. private String name;
  3. abstract void order();
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public Object clone() {
  11. Object clone = null;
  12. try {
  13. clone = super.clone();
  14. } catch (CloneNotSupportedException e) {
  15. e.printStackTrace();
  16. }
  17. return clone;
  18. }
  19. }

CheesePizza.java

  1. public class CheesePizza extends Pizza {
  2. public CheesePizza() {
  3. name = "CheesePizza";
  4. }
  5.  
  6. public void order() {
  7. System.out.println("Book a CheesePizza");
  8. }
  9. }

VeggiePizza.java

  1. public class VeggiePizza extends Pizza {
  2. public VeggiePizza() {
  3. name = "VeggiePizza";
  4. }
  5.  
  6. public void order() {
  7. System.out.println("Book a VeggiePizza");
  8. }
  9. }
  1. public class PizzaCache {
  2. private static Hashtable<String, Pizza> PizzaMap = new Hashtable<String, Pizza>();
  3.  
  4. public static Pizza getPizza(String pizzaName) {
  5. Pizza cache = PizzaMap.get(pizzaName);
  6. return (Pizza) cache.clone();
  7. }
  8.  
  9. public static void loadCache() {
  10. CheesePizza cheesePizza = new CheesePizza();
  11. PizzaMap.put(cheesePizza.getName(), cheesePizza);
  12.  
  13. VeggiePizza veggiePizza = new VeggiePizza();
  14. PizzaMap.put(veggiePizza.getName(), veggiePizza);
  15. }
  16. }
  1. public class PrototypePatternDemo {
  2. public static void main(String[] args) {
  3. PizzaCache.loadCache();
  4.  
  5. Pizza pizza1 = (Pizza) PizzaCache.getPizza("CheesePizza");
  6. System.out.println("Pizza:" + pizza1.getName());
  7.  
  8. Pizza pizza2 = (Pizza) PizzaCache.getPizza("VeggiePizza");
  9. System.out.println("Pizza:" + pizza2.getName());
  10. }
  11. }

与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。

拷贝的两种方式:

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

上面的例子实现的是浅拷贝。

浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

原型模式(Prototype Pattern)的更多相关文章

  1. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  2. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  4. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 六个创建模式之原型模式(Prototype Pattern)

    定义: 使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象. 结构图: Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类.在Java中,Object类为该 ...

  6. 原型模式(Prototype Pattern)

    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂 ...

  7. C#设计模式——原型模式(Prototype Pattern)

    一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...

  8. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

  9. 原型模式(Prototype Pattern)--对象的克隆

    定义:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 原型类的核心在于如何实现克隆方法: 能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个类支持被复制; 通 ...

  10. 设计模式——原型模式(Prototype Pattern)

    原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...

随机推荐

  1. HDU4607 - Park Visit(树的直径)

    题目大意 给定一颗树,要求走过其中连续的k个点,使得步数最少 题解 每条边要么经过两次,要么一次,因为我们的目标就是使得走一次的边尽量的多,这样就转换成求树的直径了,求树的直径我用的是两次dfs,先随 ...

  2. Codeforces2B - The least round way(DP)

    题目大意 给定一个N*N的格子,每个格子里有一个非负数,要求你找出从左上角到右下角的一条路径,使得它满足路径上的格子里的数全部乘起来的积尾部0最少 题解 如果要产生0肯定是2*5得出来的,最终的乘积可 ...

  3. uva_12535 - Probability Through Experiments

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 多目标遗传算法 ------ NSGA-II (部分源码解析) 临时种群生成新父代种群 fillnds.c

    /* Nond-domination based selection routines */ # include <stdio.h> # include <stdlib.h> ...

  5. 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果

    AlphaAnimation 透明效果实现: activity_main.xml中仅仅是一个简单的图片,下面的例子都会使用这个xml: <RelativeLayout xmlns:android ...

  6. linux下查看本机socket端口详细信息

    netstat -paut [root@OA-JRY-SY-FDEP1 nginx-]# netstat -paut Active Internet connections (servers and ...

  7. 使用startCoroutine制定倒计时

    使用startCoroutine制定倒计时 using UnityEngine; using System.Collections; public class TimerCoroutine : Mon ...

  8. stack计算表达式的值

    9.52 使用stack对象处理带圆括号的表达式.遇到左圆括号时,将其标记下来.当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈. 接 ...

  9. CopyU!下一次更新将增加对设备厂商及型号的识别!

    CopyU!下一版本的更新将加入对设备厂商及型号的识别功能,当用户连接设备时,CopyU!将能够辨别出设备的详细型号等,能够在一定程度上帮助用户发现问题设备或仿冒设备. 敬请期待即将到来的新更新!

  10. IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词。终极解决办法!!!!

    首先这个问题在其他网站(CSDN,新浪博客等) 回答基本都是没有回答到"根本"上面来(而且总在纠结要不要勾选"全部谓词") 我是自己对比了本地IIS之后得出的结 ...