原型设计模式(prototype
# 什么是原型设计模式
> 这里与软件工程中的原型开发模式有那么一点类似的地方,我们首先需要构建出一个原型,这个原型可以在现实开发中抽象出来的具体类型,但是这个类型与具体的类又不同,需要抽取公共的部分,通过构建管理器,实现创建不同需要的类型,
### 考虑使用原型设计模式的三种情况
第一种情况是需要处理的对象太多,如果将它们分别作为一个类,必须要编写很多个类文件难以根据类生成实例时
第二种情况是生成实例的过程太过复杂,很难根据类来生成实例。例如,我们假设这里有一个实例,即表示用户在图形编辑器中使用鼠标制作出的图形的实例。想在程序中创建这样的实例是常困难的,通常,在想生成一个和之前用户通过操作所创建出的实例完全一样的实例的时候,我们会事先将用户通过操作所创建出的实例保存起来,然后在需要时通过复制来生成新的实例想解藕框架与生成的实例时
第三种情况是想要让生成实例的框架不依赖于具体的类。这时,不能指定类名来生成实例,而要事先“注册”一个“原型”实例,然后通过复制该实例来生成新的实例。
### 类接口表关系表
|
包 |
类名 |
描述 |
|
framework |
manager |
调用createclone |
|
framework |
product |
声明use createclone |
|
naN |
rectangle |
具体打印矩形 |
|
nan |
triangle |
具体打印三角形 |
Prototype 是由product担任的
ConcreteProtopyte 实现赋值新实例的方法 由具体的你需要的角色来担任
Client 通过调用createclone 创建新的实例,由Manger类扮演这个角色
### uml

use 在接口中是交给子类去实现的
createclone 创建具体的对象
- code framework
package base.prototype.framework;
/**
* @program: DesignPatterns
* @description: 声明use, createclone具体复用
* @author: Mr.Dai
* @create: 2018-05-28 21:28
**/
public interface Product extends Cloneable {
public abstract void use(int len);
public abstract Product createClone();
}
import java.util.HashMap;
/**
* @program: DesignPatterns
* @description: 产生具体的类,维护多重对象
* @author: Mr.Dai
* @create: 2018-05-28 21:31
**/
public class Manager {
private HashMap<String,Product> warehouse=new HashMap<>();
public void registers(String name,Product product){
warehouse.put(name,product);
}
public Product createObj(String name){
Product product = warehouse.get(name);
return product.createClone();
}
}
- code domain 具体的实现的类
/**
* @program: DesignPatterns
* @description: 打印矩形
* @author: Mr.Dai
* @create: 2018-05-28 21:38
**/
public class Rectangle implements Product {
private char mark = '*';
public Rectangle(char mark) {
this.mark = mark;
}
public Rectangle() {
}
@Override
public void use(int len) {
for (int i = 0; i < len; i++) {
if(i==0||i==len-1){
for (int k = 0; k < len; k++) System.out.print(mark);
}else{
System.out.print('*');
for (int j = 0; j < len-2; j++) {
System.out.print(' ');
}
System.out.print('*');
}
System.out.println();
}
}
@Override
public Product createClone() {
Product product = null;
try {
product = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return product;
}
}
import base.prototype.framework.Product;
/**
* @program: DesignPatterns
* @description: 打印三角形
* @author: Mr.Dai
* @create: 2018-05-28 21:47
**/
public class Triangle implements Product {
@Override
public void use(int len) {
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
System.out.print(' ');
}
for (int j = 0; j < 2*i + 1; j++) {
System.out.print('*');
}
System.out.println();
}
}
@Override
public Product createClone() {
Product product=null;
try {
product=(Product)clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return product;
}
}
- 结果

### 需要说明的是
> 面向对象的根本思想是作为组件复用:一旦出现的类名字就无法与该类区分开来,也就无法实现复用,如果不替换源代码 以java来说,重要的是当只有class文件的时候还能不能被复用,即使没有java文件也能够复用才是关键,
>要注意在顶层product 接口声明 集成的java.lang.cloneable。的接口是称之为标记接口 只要这样下面雇用的具体的类才能调用具体的clone方法才不会抛出异常,,说明了 实现了cloneable 接口的实例是可以进行调用clone方法进行复制的,返回是一个新的实例,(clone内部所进行的处理是分配与要复制的实例同样大小的内存空间,是一盒字段复制 也很称 浅拷贝);也就是说 如在类中存在 数组 那么拷贝 只会拷贝数组的引用,不会对数组进行正的复制。如果你需要一个新的引用那么你需要 重写clone ,但是不要忘记 调用super。clone
### 相关设计模式
- Flyweight
prototype可以生成一个与当前实例相同的的实例,使用Flyweight 模式可以在不同的地方使用同一个实例。
- Memento
提供保存当前实例状态,实现撤销与快照功能
- Composite 与 Decorator模式
如果需要动态创建复杂的结构的实例,可以用prototype作为clone
- Command
复制Command模式中出现的额命令时,可以使用Prototype
原型设计模式(prototype的更多相关文章
- 原型设计模式 Prototype
参考1 http://www.cnblogs.com/libingql/p/3633377.html http://www.cnblogs.com/promise-7/archive/2012/06/ ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- [设计模式] 4 原型模式 prototype
设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 设计模式的征途—5.原型(Prototype)模式
相信大多数的人都看过<西游记>,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉.孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可 ...
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- python 设计模式之原型模式 Prototype Pattern
#引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...
随机推荐
- Dubbo动态负载均衡(socket环境实现)
消费者 去注册中心获取信息 然后缓存到本地 如果有生产者某个服务宕机了 会通过通知的方式告知 (订阅的方式) 微服务rpc远程调用框架中,服务的负载均衡都是采用本地负载均衡的,Spring Clou ...
- VS调试的问题
调试Vs,使用本地IIS也不行,使用外部服务器也不行,最后运行VS2013以管理员身份就可以了
- 深入理解JVM - 线程安全与锁优化 - 第十三章
线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对 ...
- BZOJ 3410 [Usaco2009 Dec]Selfish Grazing 自私的食草者:贪心【最多线段覆盖】
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1324 题意: 给你n个区间,问你最多能选择多少个区间使得它们不相互覆盖. 题解: RQ ...
- html5--2.7新的布局元素(4)-time
html5--2.7新的布局元素(4)-time 学习要点 了解微格式的概念 掌握time元素的用法 微格式的概念 HTML5中的微格式,是一种利用HTML5中的新标签对网页添加附加信息的方法,附加信 ...
- mac快速正确的安装 Ruby, Rails 运行环境
Mac OS X 任意 Linux 发行版本(Ubuntu,CentOS, Redhat, ArchLinux ...) 强烈新手使用 Ubuntu 省掉不必要的麻烦! 以下代码区域,带有 $ 打头的 ...
- JavaMail API的应用
JavaMail API 是一个用于阅读.编写和发送电子消息的可选包(标准扩展),用来创建邮件用户代理(Mail User Agent,MUA)类型程序. JavaMail API 需要 JavaBe ...
- 「NOIP2017」「LuoguP3952」 时间复杂度(模拟,栈
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- 发个IOCP的C++例子
IOCP的c++例子 IOCP这个东西连续关注了将近3年的时间,这个代码从哪里找到的已经忘了,下面是作者的信息.感谢他提供的代码! /*++ Copyright (c) 2004 模块名: iomod ...
- DataGridColum的bug
Datagrid有多个bug: 1,不支持DynamicResource的东西 2, 在Column隐藏后再显示, ColumnHeader的Tag或者DataContext为null. 解决办法: ...