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

  模式意图

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

  模式结构

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

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

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

  ConcretePrototype 原型的具体实现。

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

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

  使用场景

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

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

  代码结构

  【简单原型模式

 package com.xingoo.test;

 interface Prototype{
public Object clone();
}
class ConcretePrototype1 implements Prototype{
public Object clone() {
Prototype prototype = new ConcretePrototype1();
return prototype;
}
}
class ConcretePrototype2 implements Prototype{
public Object clone(){
Prototype prototype = new ConcretePrototype2();
return prototype;
}
}
public class Client{
public static void main(String[] args){
Prototype p1 = new ConcretePrototype1();
System.out.println("p1 "+p1); Prototype p2 = new ConcretePrototype2();
System.out.println("p2 "+p2); Prototype prototype = (Prototype)p1.clone();
System.out.println("prototype "+prototype);
prototype = (Prototype)p2.clone();
System.out.println("prototype "+prototype);
}
}

  运行结果

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

  【登记模式的原型模式

 package com.xingoo.test1;

 import java.util.HashMap;
import java.util.Map;
/**
* 原型的接口
* @author xingoo
*/
interface Prototype{
public Prototype clone();
}
/**
* 具体的实现类1
* @author xingoo
*
*/
class ConcretePrototype1 implements Prototype{
public Prototype clone() {
Prototype prototype = new ConcretePrototype1();
return prototype;
}
}
/**
* 具体的实现类2
* @author xingoo
*
*/
class ConcretePrototype2 implements Prototype{
public Prototype clone(){
Prototype prototype = new ConcretePrototype2();
return prototype;
}
}
/**
* 原型的管理器
* @author xingoo
*
*/
class PrototypeManager{
/**
* 用于保存原型的实例
*/
private static Map<String,Prototype> map = new HashMap<String,Prototype>();
/**
* 静态方法创建构造函数,避免外部类调用
*/
private PrototypeManager(){
}
/**
* 添加原型
* @param protoName 原型的名字
* @param prototype 原型的实例
*/
public synchronized static void setPrototype(String protoName,Prototype prototype){
map.put(protoName, prototype);
}
/**
* 获得原型
* @param protoName 原型的名字
* @return 返回原型的实例
* @throws Exception 如果找不到,则跑出找不到异常
*/
public synchronized static Prototype getPrototype(String protoName) throws Exception{
Prototype prototype = map.get(protoName);
if(prototype == null){
throw new Exception("no "+protoName+" in Manager");
}
return prototype;
}
/**
* 从管理器中删除原型的实例
* @param protoName 原型的名字
*/
public synchronized static void removedPrototype(String protoName){
map.remove(protoName);
}
}
/**
* 原型的使用者
* @author xingoo
*
*/
public class Client {
public static void main(String[] args){
try{
/**
* 创建一种原型的实现,放入管理器中
*/
Prototype p1 = new ConcretePrototype1();
System.out.println("p1 "+p1);
PrototypeManager.setPrototype("MyPrototype", p1); Prototype prototype1 = PrototypeManager.getPrototype("MyPrototype").clone();
System.out.println("prototype1 "+prototype1);
/**
* 切换成另一种原型的实现,修改管理器中的对象
*/
Prototype p2 = new ConcretePrototype1();
System.out.println("p2 "+p2);
PrototypeManager.setPrototype("p1", p2); Prototype prototype2 = PrototypeManager.getPrototype("MyPrototype").clone();
System.out.println("prototype2 "+prototype2);
/**
* 注销该原型实现,对象使用后,观察情况
*/
PrototypeManager.removedPrototype("MyPrototype"); Prototype prototype3 = PrototypeManager.getPrototype("MyPrototype").clone();
System.out.println("prototype3 "+prototype3); }catch(Exception e){
e.printStackTrace();
}
}
}

  运行结果

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 Manager
at com.xingoo.test1.PrototypeManager.getPrototype(Client.java:)
at com.xingoo.test1.Client.main(Client.java:)

【设计模式】—— 原型模式Prototype的更多相关文章

  1. PHP设计模式 原型模式(Prototype)

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

  2. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

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

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

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

    场景分析: 前面我们提到,交易对象Trade,还有继承他的债券交易BondTrade.期货交易FutureTrade. 现在有一个需求,需要提供方法将交易拆分成多笔小交易. 代码如下(如果没有clon ...

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

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

  6. 大话设计模式--原型模式 Prototype -- C++实现

    1. 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象... 注意: 拷贝的时候是浅拷贝 还是 深拷贝, 来考虑是否需要重写拷贝构造函数. 关键在于: virtual Pro ...

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

    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印 ...

  8. 设计模式--原型模式Prototype(创建型)

    一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...

  9. 谈谈设计模式~原型模式(Prototype)

    返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式 ...

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

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

随机推荐

  1. [CQOI2012]组装 贪心

    [CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...

  2. java四舍五入

    package com.clzhang.sample; import java.math.BigDecimal; import java.math.RoundingMode; import java. ...

  3. javascript中encodeURI和decodeURI方法使用介绍

    encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误, 所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字 ...

  4. 解决在控制层springmvc框架发出的400状态的错误

    错误场景: 错误分析: 这也是我第一次遇到这个类型的异常,400响应状态代表:客户端发出的请求中携带的参数与服务器端接受的参数类型不匹配,进一步就是说我后台的实体类中数据类型为Date,而前台传递过来 ...

  5. Springboot日记——核心编码篇

    背景吐槽:想要让自己进阶一下,一定要有个可以拿出来秀的东西,所以要尝试写一个属于自己的网站或者平台.因此,我大概的看了一下springboot+Mybatis-plus+... 框架介绍 通常 SSM ...

  6. SQL Server Management Studio 键盘快捷键

    光标移动键盘快捷键 操作 SQL Server 2012 SQL Server 2008 R2 左移光标 向左键 向左键 右移光标 向右键 向右键 上移光标 向上键 向上键 下移光标 向下键 向下键 ...

  7. Received non-all-whitespace CHARACTERS or CDATA event in nextTag(). ,无法整齐打印验证错误。 解析XML文档出现的问题

    在启动keyCloak,想要在standAlone模式下切换数据库,修改standAlone.xml文件时. 在bin/目录下启动standAlone模式出现错误: 10:07:24,799 INFO ...

  8. C++ chrono 库中的 steady_clock 和 system_clock

    C++11 中提供了一个计时的标准库 <chrono>; 里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock ...

  9. Netty源码分析第7章(编码器和写数据)---->第5节: Future和Promies

    Netty源码分析第七章: 编码器和写数据 第五节: Future和Promise Netty中的Future, 其实类似于jdk的Future, 用于异步获取执行结果 Promise则相当于一个被观 ...

  10. VMware vCenter Converter迁移Linux系统虚拟机

    (一)简介VMware vCenter Converter Standalone,是一种用于将虚拟机和物理机转换为 VMware 虚拟机的可扩展解决方案.此外,还可以在 vCenter Server ...