原型模式-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类为该 ...
随机推荐
- 通用HttpClientUtil工具类
package com.*.utils; import java.io.IOException; import java.net.URI; import java.util.ArrayList; im ...
- First Show
随便写写,记录美好生活 博客的内容主要是关于java后台开发所涉及到技术栈的学习记录
- Android探究之View的绘制流程
Android中Activity是作为应用程序的载体存在,代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当Activity启动时,我们会通过setContentView方法来设置一个内容视图 ...
- rabbitmq之简述HAProxy配置集群过程
简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的.借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案.HA ...
- Python encode和decode
今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中 ...
- [转]Lua和Lua JIT及优化指南
一.什么是lua&luaJit lua(www.lua.org)其实就是为了嵌入其它应用程序而开发的一个脚本语言, luajit(www.luajit.org)是lua的一个Just-In-T ...
- 删除Widows 启动项中的信息
1.打开任务管理器切换到启动Tab,在需要删除的项目上点击右键,点击打开文件所在位置,这样就找到了启动项所在磁盘位置,可以根据需要决定是否删除. 2.从注册表中删除在启动中的注册信息. regedit ...
- 应用wavesurfer.js绘制音频波形图小白极速上手总结
一.简介 1.1 引 人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博 ...
- ubuntu18.04安装spark(伪分布式)
在安装spark之前,首先需要安装配置Hadoop,这个就不做详细介绍了,可以参看博主的另一篇: https://blog.csdn.net/weixin_42001089/article/detai ...
- 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片
http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...