【设计模式】—— 原型模式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 ...
随机推荐
- JZOJ 10043 第k小数
Description 有两个非负整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到NM个数,询问这NM个数中第K小数是多少. 时间限制为20ms . Input 输入文 ...
- Python之闭包函数、装饰器
1.闭包函数 #作用域关系在函数定义阶段时就已经固定死了,与调用位置无关 # 即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系 # def f1(): # x=1 # def inner(): ...
- javascript中的toString()方法
javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...
- Object Relational Mapping框架之Hibernate
hibernate框架简介: hibernate框架就是开发中在持久层中应用居多的ORM框架,它对JDBC做了轻量级的封装. (百度介绍,感觉不错) 什么是ORM:Object Relational ...
- 《javascript语言精粹》mindmap
最近刚刚读完<javascript语言精粹>,感觉其中的内容确实给用js作开发语言的童鞋们提了个醒——js里面坑很多啊 不过,我也并不完全认同书中所讲的所有内容,有些书中认为是糟粕的特性, ...
- 【TestNG测试】TestNG、Maven、testng.xml构建测试工程
创建一个maven工程 使用Idea创建maven工程 建立类似如上的工程结构,src/main/java,src/test/java,pom.xml,testng.xml,这里由于我们使用工程是 ...
- Linux 安装JDK Tomcat MySQL(使用Mac远程访问)
阅读本文需要一定的Linux基础 一 环境 阿里云服务器: CentOS 7.4 64位(基于RedHat) 本机: macOS High Sierra 二 压缩包 JDK http://www.or ...
- 统计学习方法c++实现之七 提升方法--AdaBoost
提升方法--AdaBoost 前言 AdaBoost是最经典的提升方法,所谓的提升方法就是一系列弱分类器(分类效果只比随机预测好一点)经过组合提升最后的预测效果.而AdaBoost提升方法是在每次训练 ...
- C/S结构与B/S结构
按照是否需要访问网络,程序可分为网络程序与非网络程序.其中网络程序又可分为B/S结构与C/S结构. C/S结构是指客户端(Client)/服务器(Server)模式,这种模式的客户端中 需要安装一个R ...
- python3 通过qq邮箱定时发送邮件
下面的代码为了每天定时发送监控邮件,监控什么呢?监控当天redis队列中是否有没有消费的数据,和当天mysql中新增的数据量 # -*- coding:utf-8 -*- from common.re ...