原型模式-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类为该 ...
随机推荐
- Numpy库的学习(四)
我们今天继续学习一下Numpy库 接着前面几次讲的,Numpy中还有一些标准运算 a = np.arange(3) print(a) print(np.exp(a)) print(np.sqrt(a) ...
- Not on FX application thread; currentThread = AWT-EventQueue-0的解决方法
swing awt跑javafx报了这问题 Not on FX application thread; currentThread = AWT-EventQueue-0 解决方法 Platform.r ...
- Postgres 优雅存储树形数据
碰到一个树形数据需要存储再数据控制,碰到以下两个问题: 在PG数据库中如何表达树形数据 如何有效率的查询以任意节点为Root的子树 测试数据 为了更加简单一些,我们将使用一下数据 Section A ...
- Asp.Net WebAPI配置接口返回数据类型为Json格式
Asp.Net WebAPI配置接口返回数据类型为Json格式 一.默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XM ...
- Swift 产生 uuid
项目中.需要客户端生成一个唯一的识别码 let uuid = UUID().uuidString print(uuid)
- linux 系统shell运行程序不退出
如果通过ssh远程连接到linux系统终端,在shell下执行程序.假如程序名称为app,且程序本身会一直执行不退出,程序执行需要参数文件paramfile. 当我们用 ./app paramfile ...
- [十二省联考2019]D2T2春节十二响
嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...
- 多种解法解决n皇后问题
多种解法解决n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后,要求每 ...
- button JS篇ant Design of react
这篇看ant Desgin of react的button按钮的js代码,js代码部分是typescript+react写的. button组件里面引用了哪些组件: import * as React ...
- .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)
引言 上星期发布的.NET452+AdminLTE版框架得到了大家的大力支持,目前GitHub已获近100星,鄙人十分高兴能够帮助大家.其中有不少关心.NET Core的支持情况,因为未来的.NET平 ...