原型模式-Prototype(Java实现)
原型模式-Prototype
通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象.
就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕后. 蛋糕师就会为顾客新做一份一模一样的.
这样就可以说明为什么要有prototype模型, 而不是每次都重新new一个了.
因为每次都重新new一个的话, 代表着蛋糕要从设计到制作都要现场完成. 这时很困难的.
如果有一个原型的话. 蛋糕师就可以根据这个模板, 来参照着做出一个一模一样的. 显然这样的难度降低了很多.
卖笔和卖蛋糕的原理是一样的.本文以笔为例.
有一个管理类UnderLinePenManager, 里面有三种笔. 第一种能画波浪线, 第二种能画直线, 第三种能画虚线.
如果有人想要这三种里的某一种. 那么就根据管理类里已经注册好的模板来新建一个一样的笔出来.
本例子中的类关系图:

类的依赖关系:

Product接口
我们将使用原型模式来创建对象, 而这些对象, 就被抽象为Product
Product还提供了复制方法createClone(). 继承了Cloneable接口.
注意: 这里的createClone()方法并不是继承于Cloneable, Cloneable里面并没有声明任何方法, Cloneable只是起标记作用的一个接口.
public interface Product extends Cloneable {
void use(String str);
Product createClone();
}
UnderlinePen类
这是Product接口的实现类, 下划线类.
向特定的下划线类传入一个字符串后, 他会打印出该字符串和下划线
public class UnderLinePen implements Product {
/**
* 下划线字符
*/
private char underLineChar;
public UnderLinePen(char ch) {
this.underLineChar = ch;
}
/**
* 传入str后, 会打印str和下划线
*/
@Override
public void use(String str) {
System.out.println("\"" + str + "\"");
System.out.print(" ");
for (int i = 0; i < str.getBytes().length; i++) {
System.out.print(underLineChar);
}
System.out.println("");
}
/**
* 返回一个克隆
*/
@Override
public Product createClone() {
try {
return (Product) this.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
UnderLinePenManager类
用于统一管理产品, 他来负责注册和克隆
public class UnderLinePenManager {
/**
* 各种笔注册到这里, 统一管理
*/
private static final HashMap<String, Product> PENS = new HashMap<>();
/**
* 注册笔
*/
public static void register(String name, Product pen) {
PENS.put(name, pen);
}
/**
* 从注册中心HashMap以name为key取出来一只笔, 然后克隆一个新的来返回
*/
public static Product createPen(String name) {
return PENS.get(name).createClone();
}
}
Main
该类用于运行测试
public class Main {
static {
/**
* 将各种笔注册到Manager来统一管理
*/
UnderLinePenManager.register("wave-line" , new UnderLinePen('~'));
UnderLinePenManager.register("bee-line" , new UnderLinePen('_'));
UnderLinePenManager.register("dotted-line", new UnderLinePen('.'));
}
public static void main(String[] args) {
// 每次需要某种笔的时候, 根据现有的笔来进行克隆一份就好了
// 取出一只波浪线的笔
Product anotherPen1 = UnderLinePenManager.createPen("wave-line");
// 用波浪线的笔来打印
anotherPen1.use("hello world");
}
}

原型模式-Prototype(Java实现)的更多相关文章
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- 《JAVA设计模式》之原型模式(Prototype)
在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...
- 六个创建模式之原型模式(Prototype Pattern)
定义: 使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象. 结构图: Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类.在Java中,Object类为该 ...
随机推荐
- rocketmq延时消息
rocketmq提供一种延时消息的解决方案,就是在特定的时间到了,消息才会被投递出去供consumer消费. 总体来是简单的场景是满足了,但是需要注意的是延时的时间是需要按照默认配置的延时级别去配置的 ...
- phpdocumentor 安装以及使用说明
一 缘由 最近改版公司网站和app端的api,发现很多函数和方法都没写注释,搞得每次调用之前还需要看底层实现,有的方法名和功能还类似,区分不出使用哪个最优!为了避免给后人挖坑,除了将代码写得规范外, ...
- anki server 错误与解决
anki 客户端 转载请注明出处 :http://www.cnblogs.com/qq-757617012/ 1.无法同步 是否突然停电,导致程序损坏(提示被防火墙或杀毒软件阻止) anki客 ...
- 智表ZCELL产品V1.4.0开发API接口文档 与 产品功能清单
为了方便大家使用ZCELL,应网友要求,整理编写了相关文档,现与产品一起同步发布,供大家下载使用,使用过程中如有疑问,请与我QQ联系. 智表(ZCELL)V1.4.0版本 功能清单文档下载地址: 功 ...
- MySQL 常用语句总结
用一个表更新另一个表 UPDATE table1 t1, table2 t2 SET t1.field1 = t2.field1, t1.field2 = t2.field2 WHERE t1.fie ...
- 让自己的开源项目支持CocoaPods
测试的时候找个自己封装的方法或UI控件就可以了 这里用我刚封装的Redirect重定向的请求体为例 1, 在github上创建一个Redirect,重要:记得选择开源协议 (MIT)(如果木有GitH ...
- javaweb项目环境搭建,jdk,tomcat,myeclipse,sqlserver安装 配置
myeclipse是一个java的IDE,myeclipse中虽然内置了JDK和Tomacat服务器,但可以不使用,通过进行相应的配置,使用自行安装的JDK和Tomcat.安装Tomcat之前,一定要 ...
- 菜鸟学IT之python词云初体验
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 1. 下载一长篇中文小说. 2. 从文件读取待分析文本. txt = ...
- 【c语言】分配内存与释放内存
提示:现在内存区定出一片相当大的连续空间(如1000字节).然后开辟与释放都在此空间进行.假设指针变量p原已指向未用空间的开头,调用alloc(n)后,开辟了n个字节可供程序适使用.现在需要使 p的值 ...
- Vuex 存储||获取后台接口数据
如果你对 Vuex 有一定的了解的话呢,可以继续这一篇的学习了,如果没有的话, 建议先看一看我的上一篇 Vuex基础:地址在下面 Vuex的详解与使用 Vuex刷新数据不丢失 这篇接着上一篇: 这篇将 ...