【设计模式】—— 原型模式Prototype
前言:【模式总览】——————————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的更多相关文章
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- [工作中的设计模式]原型模式prototype
一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...
- C#设计模式——原型模式(Prototype Pattern)
一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...
- 设计模式-原型模式(Prototype)
场景分析: 前面我们提到,交易对象Trade,还有继承他的债券交易BondTrade.期货交易FutureTrade. 现在有一个需求,需要提供方法将交易拆分成多笔小交易. 代码如下(如果没有clon ...
- 设计模式——原型模式(Prototype Pattern)
原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...
- 大话设计模式--原型模式 Prototype -- C++实现
1. 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象... 注意: 拷贝的时候是浅拷贝 还是 深拷贝, 来考虑是否需要重写拷贝构造函数. 关键在于: virtual Pro ...
- 设计模式——原型模式(Prototype)
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印 ...
- 设计模式--原型模式Prototype(创建型)
一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...
- 谈谈设计模式~原型模式(Prototype)
返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式 ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
随机推荐
- CentOS 7 安装 caffe
1.安装CUDA,很简单,傻瓜式安装 2.http://caffe.berkeleyvision.org/install_yum.html 按照里面安装 3.遇到的问题: LD -o .build_r ...
- DB异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
一,RECOVERY PENDING状态 今天修改了SQL Server的Service Account的密码,然后重启SQL Server的Service,发现有db处于Recovery Pendi ...
- ASP.NET Core Token认证
翻译:Token Authentication in ASP.NET Core 令牌认证(Token Authentication)已经成为单页应用(SPA)和移动应用事实上的标准.即使是传统的B/S ...
- Python学习之路:MINST实战第一版
1.项目介绍: 搭建浅层神经网络完成MNIST数字图像的识别. 2.详细步骤: (1)将二维图像转成一维,MNIST图像大小为28*28,转成一维就是784. (2)定义好神经网络的相关参数: # M ...
- 微信小程序-帝国cms会员系统调用
在用户->管理会员字段,增加如下字段:openidsession_keylsktokennicknameheadimg设置用户名长度然后,在系统,系统变最设置,用户设置,将注册用户名设置长度改成 ...
- GearCase UI - 自己构建一套基于 Vue 的简易开源组件库
最近 1 ~ 2 月除了开发小程序之外,还一直在继续深入的学习 Vuejs.利用零碎.闲暇的时间整合了一套基于 Vue 的 UI 组件库.命名为 GearCase UI,意为齿轮盒.现在把该项目进行开 ...
- 在IIS中部署Asp.Net网站
在IIS中部署Asp.Net网站 1.添加IIS或者删除IIS,在控制面板=>程序和功能=>打开或关闭功能 启动iis,右键计算机=>管理=>服务和应用程序=>Inter ...
- 用 requests 模块从 Web 下载文件
用 requests 模块从 Web 下载文件 requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误.连接问题和数据压缩.requests 模块不是 Python ...
- PytorchZerotoAll学习笔记(一)
Pytorch的安装请参考torch的官方文档,传送门:https://pytorch.org/get-started/locally/ Numpy的复习 如果你之前没有学过Numpy的话,建议去看看 ...
- 【Oracle】存储过程在字符串单引号'内拼接单引号'
http://blog.csdn.net/u011704894/article/details/44976557 一般变量里面接3个单引号 eg: 'DELETE FROM RDM_SUPP_DATA ...