前言:【模式总览】——————————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. Spring MVC的Rest URL 被错误解析成jsp, 导致404错误(XML方式下@Controller和@RestController需要配置<mvc:annotation-driving/>)

    问题: 最近在原有MVC的WEB应用中添加一个REST服务,结果始终报404错误.把 Spring debug 日志打开,发现处理REST请求的Controller已经正确进入 [org.spring ...

  2. 2018年美国大学生数学建模竞赛(MCM/ICM) F题解题思路

    任务一:开发价格点,建立综合定价模型. 其中 a 代表开发价格点系数,代表个人财产评估.K 为 PI 交易系数 以这个进行评估,将个人划分为具有合理相似性的子组: 当 a 等于 0-30 时,子组为: ...

  3. Cloud Native Weekly | 华为云抢先发布Redis5.0,红帽宣布收购混合云提供商 NooBaa

    1——华为云抢先发布Redis5.0 2——DigitalOcean K8s服务正式上线 3——红帽宣布收购混合云提供商 NooBaa 4——微软发布多项 Azure Kubernetes 服务更新 ...

  4. VB.NET 仿Edge风格的TabControl控件

    原本是想写个Chrome内核的浏览器,但是.net语言下比较好用类库的并不多,尝试过CefSharp.Xilium.CefGlue,都发现很多坑,所以这个项目就烂尾了,现在将还有点用的代码发出来给大家 ...

  5. dubbo 多人开发时(即开发环境),版本号不要一致

    导致问题:如果版本号相同,会调到别人的服务 不需要修改配置文件.直接改idea配置即可. Configurations ====> 添加parameters ===> dubbo.cons ...

  6. zookeeper简易配置及hadoop高可用安装

    zookeeper介绍    是一个分布式服务的协调服务,集群半数以上可用(一般配置为奇数台),            快速选举机制:当集群中leader挂掉,所有小弟会投票选举出新的leader.  ...

  7. python初学者随笔Week2

    一.集合 去重,把一个列表变成集合,自动去重 关系测试,测试两组数据的交集,并集,差集关系 集合是无序的 集合的操作: list_1 = [1,4,5,7,3,6,7,9] list_1 = set( ...

  8. 基于C#的机器学习--惩罚与奖励-强化学习

    强化学习概况 正如在前面所提到的,强化学习是指一种计算机以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使程序获得最大的奖赏,强化学习不同于连督学习,区别主要表现在强化信号上,强 ...

  9. 基于Eclipse下的python图像识别菜鸟版(利用pytesseract以及tesseract)

    这是我注册博客后写的第一篇博客,希望对有相关问题的朋友有帮助. 在图像识别前,首先我们要做好准备工作. 运行环境:windows7及以上版本 运行所需软件:(有基础的可以跳过这一段)eclipse,p ...

  10. PHP.ini 能不能加载子配置文件 ?

    答案是不能,php这个地方用的是另一个方案解决的 编译的时候 用这个参数 --with-config-file-scan-dir指定一个目录 然后在这个目录里面加载ini   https://www. ...