前言:【模式总览】——————————by xingoo

  模式意图

  由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了。通过原型模式就可以通过拷贝函数clone一个原有的对象,给现在的对象使用,从而创建更多的同类型的对象。

  模式结构

  【简单原型模式】用于原型的版本不多的时候

  【登记模式的原型模式】如果原型的实现很多种版本,那么通过一个登记管理类,可以方便的实现原型的管理。

  Prototype 原型接口,定义原型的结构。

  ConcretePrototype 原型的具体实现。

  Client 使用类,创建一个原型,创建一个引用,可以随意指定要引用的实现类。

  PrototypeManager 原型的管理器,里面含有一个Map,用来保存原型的实例对象。

  使用场景

  1 当需要在运行时指定对象的实现类时。

  2 当一个类的实例只能有集中状态的一种时。(这个没怎么理解)

  代码结构

  【简单原型模式

 1 package com.xingoo.test;
 2
 3 interface Prototype{
 4     public Object clone();
 5 }
 6 class ConcretePrototype1 implements Prototype{
 7     public Object clone() {
 8         Prototype prototype = new ConcretePrototype1();
 9         return prototype;
10     }
11 }
12 class ConcretePrototype2 implements Prototype{
13     public Object clone(){
14         Prototype prototype = new ConcretePrototype2();
15         return prototype;
16     }
17 }
18 public class Client{
19     public static void main(String[] args){
20         Prototype p1 = new ConcretePrototype1();
21         System.out.println("p1 "+p1);
22
23         Prototype p2 = new ConcretePrototype2();
24         System.out.println("p2 "+p2);
25
26         Prototype prototype = (Prototype)p1.clone();
27         System.out.println("prototype "+prototype);
28         prototype = (Prototype)p2.clone();
29         System.out.println("prototype "+prototype);
30     }
31 }

  运行结果

p1 com.xingoo.test.ConcretePrototype1@1fb8ee3
p2 com.xingoo.test.ConcretePrototype2@14318bb
prototype com.xingoo.test.ConcretePrototype1@ca0b6
prototype com.xingoo.test.ConcretePrototype2@10b30a7

  【登记模式的原型模式

  1 package com.xingoo.test1;
  2
  3 import java.util.HashMap;
  4 import java.util.Map;
  5 /**
  6  * 原型的接口
  7  * @author xingoo
  8  */
  9 interface Prototype{
 10     public Prototype clone();
 11 }
 12 /**
 13  * 具体的实现类1
 14  * @author xingoo
 15  *
 16  */
 17 class ConcretePrototype1 implements Prototype{
 18     public Prototype clone() {
 19         Prototype prototype = new ConcretePrototype1();
 20         return prototype;
 21     }
 22 }
 23 /**
 24  * 具体的实现类2
 25  * @author xingoo
 26  *
 27  */
 28 class ConcretePrototype2 implements Prototype{
 29     public Prototype clone(){
 30         Prototype prototype = new ConcretePrototype2();
 31         return prototype;
 32     }
 33 }
 34 /**
 35  * 原型的管理器
 36  * @author xingoo
 37  *
 38  */
 39 class PrototypeManager{
 40     /**
 41      * 用于保存原型的实例
 42      */
 43     private static Map<String,Prototype> map = new HashMap<String,Prototype>();
 44     /**
 45      * 静态方法创建构造函数,避免外部类调用
 46      */
 47     private PrototypeManager(){
 48     }
 49     /**
 50      * 添加原型
 51      * @param protoName 原型的名字
 52      * @param prototype 原型的实例
 53      */
 54     public synchronized static void setPrototype(String protoName,Prototype prototype){
 55         map.put(protoName, prototype);
 56     }
 57     /**
 58      * 获得原型
 59      * @param protoName 原型的名字
 60      * @return 返回原型的实例
 61      * @throws Exception 如果找不到,则跑出找不到异常
 62      */
 63     public synchronized static Prototype getPrototype(String protoName) throws Exception{
 64         Prototype prototype = map.get(protoName);
 65         if(prototype == null){
 66             throw new Exception("no "+protoName+" in Manager");
 67         }
 68         return prototype;
 69     }
 70     /**
 71      * 从管理器中删除原型的实例
 72      * @param protoName 原型的名字
 73      */
 74     public synchronized static void removedPrototype(String protoName){
 75         map.remove(protoName);
 76     }
 77 }
 78 /**
 79  * 原型的使用者
 80  * @author xingoo
 81  *
 82  */
 83 public class Client {
 84     public static void main(String[] args){
 85         try{
 86             /**
 87              * 创建一种原型的实现,放入管理器中
 88              */
 89             Prototype p1 = new ConcretePrototype1();
 90             System.out.println("p1 "+p1);
 91             PrototypeManager.setPrototype("MyPrototype", p1);
 92
 93             Prototype prototype1 = PrototypeManager.getPrototype("MyPrototype").clone();
 94             System.out.println("prototype1 "+prototype1);
 95             /**
 96              * 切换成另一种原型的实现,修改管理器中的对象
 97              */
 98             Prototype p2 = new ConcretePrototype1();
 99             System.out.println("p2 "+p2);
100             PrototypeManager.setPrototype("p1", p2);
101
102             Prototype prototype2 = PrototypeManager.getPrototype("MyPrototype").clone();
103             System.out.println("prototype2 "+prototype2);
104             /**
105              * 注销该原型实现,对象使用后,观察情况
106              */
107             PrototypeManager.removedPrototype("MyPrototype");
108
109             Prototype prototype3 = PrototypeManager.getPrototype("MyPrototype").clone();
110             System.out.println("prototype3 "+prototype3);
111
112         }catch(Exception e){
113             e.printStackTrace();
114         }
115     }
116 }

  运行结果

p1 com.xingoo.test1.ConcretePrototype1@116ab4e
prototype1 com.xingoo.test1.ConcretePrototype1@129f3b5
p2 com.xingoo.test1.ConcretePrototype1@13f3045
prototype2 com.xingoo.test1.ConcretePrototype1@17a29a1
java.lang.Exception: no MyPrototype in Managerat com.xingoo.test1.PrototypeManager.getPrototype(Client.java:66)at com.xingoo.test1.Client.main(Client.java:109)

转载于:https://www.cnblogs.com/xing901022/p/4050910.html

【设计模式】—— 原型模式Prototype相关推荐

  1. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  2. Java设计模式--原型模式Prototype

    原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...

  3. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  4. 设计模式-原型模式(Prototype)

    Specify the kinds of objects to create using a prototypical instance,and create new objects bycopyin ...

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  6. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

  8. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

  9. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  10. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

最新文章

  1. django学习之Model(四)MakingQuery
  2. HTTP网页请求响应的状态码/状态代码
  3. Elasticseach 从零开始学习记录(二) - Head插件
  4. 神奇的mysql查询
  5. No module named ‘win32com‘
  6. PASCAL VOC2012数据集下载地址
  7. 基于Java的实验室预约管理系统
  8. 从fastq生成vcf文件
  9. 翻译 Scribe : a way to aggregate data and why not, to directly fill the HDFS?
  10. 用matlab画出ex,如何用matlab画函数图形
  11. leetcode 5. 最长回文子串(c++)
  12. C语言中-含义,比如说 p=p-next
  13. event-log-tags
  14. Java多线程模拟运动比赛
  15. 用python函数画德国国旗代码_每日一程-11.利用Python turtle库绘制国旗
  16. 网站降权如何查询?几个方法定位网站是否被降权
  17. python目前有多少库存_统计库存数量的软件,库存有多少,一键统计查询
  18. 专家推荐五个免费的网络安全工具
  19. Linux Ubuntu 22.04实现打开、最小化时呈现魔灯效果
  20. 如何通过X1使电脑上网

热门文章

  1. Linux 高可用(HA)集群之Pacemaker详解
  2. 496. Next Greater Element I - LeetCode
  3. 第3章 StringBuilder类
  4. Softmax 函数的特点和作用是什么?
  5. 我的Android进阶之旅------Android Studio 快捷键整理分享
  6. 自动布局(autoLayout)演练2
  7. IE6 CSS的一个bug
  8. vs2008 试用版评估期结束的解决方法(2009-08-
  9. 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」
  10. 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件