创建模式--原型模式(JAVA)
原型模式:
原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例。比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理。 打个比方:吃面是个处理类,面是个模型对象。我们将面从锅里煮熟(模型对象的赋值加工)出来后,分到好几个碗中(克隆)。然后再根据客户的要求对克隆出的面由不同的吃面对象再加工(放辣子,放醋,盐少等等),最后呈现到每个顾客面前的面就都不一样了。
表现形式:
1. 简单形式
2. 登记形式
1.简单形式
浅克隆要实现cloneable接口,因克隆是Object的一个native方法,因此父类要重新复写clone方法,调用object的native的clone。因此可自建一个所有原型类的抽象类或者接口,防止原型类未复写clone方法而无法克隆本体。如果对象中套用对象需要在clone中对套用的对象再进行clone,如果对复杂的对象就要用流形式深拷贝,需要实现Serialized接口。
详见:深拷贝和浅拷贝(http://www.cnblogs.com/DennyZhao/p/7016528.html)
public abstract class BaseProtoType implements Cloneable {
/**
*不能用抽象方法,clone最终调用Object的clone
*/
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
BaseProtoType
public interface Noddles {
public int longer();
public int stronger();
public void setDelicate(String str);
}
Noddles
public class NoddlesProtoType extends BaseProtoType implements Noddles{
private int longer;
private int stronger;
@Override
public int longer() {
System.out.println("---lonnger-----" + this.longer);
return this.longer;
}
@Override
public int stronger() {
System.out.println("---stronger-----" + this.stronger);
return this.stronger;
}
@Override
public void setDelicate(String str) {
System.out.println("---delicate-----" + str);
}
public int getLonger() {
return longer;
}
public void setLonger(int longer) {
this.longer = longer;
}
public int getStronger() {
return stronger;
}
public void setStronger(int stronger) {
this.stronger = stronger;
}
}
NoddlesProtoType
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, CloneNotSupportedException {
NoddlesProtoType noddles = new NoddlesProtoType();
noddles.setLonger(4);
noddles.setStronger(8);
Noddles noddles2 = (Noddles)noddles.clone();
noddles2.longer();
noddles2.stronger();
noddles2.setDelicate("salt");
Noddles noddles3 = (Noddles)noddles.clone();
noddles3.longer();
noddles3.stronger();
noddles3.setDelicate("chilli");
}
测试方法
运行结果:
---lonnger-----4
---stronger-----8
---delicate-----salt
---lonnger-----4
---stronger-----8
---delicate-----chilli
2. 登记形式
将多个类的克隆由一个管理类统一管理,注册,克隆。
package pattern.creation.factory; import java.util.HashMap;
import java.util.Map; /**
* 这种管理器只能有一个,因此采用单例模式
*
* @author DennyZhao
* @date 2017年6月20日
* @version 1.0
*/
public class PrototypeManager { private Map<String, BaseProtoType> map = new HashMap<String, BaseProtoType>(); private static PrototypeManager propoManager = null;
/**
* 私有化
*/
private PrototypeManager(){ } /**
* 创建实例方法
* @return
*/
public static PrototypeManager newInstance(){
if(propoManager == null){
synchronized(PrototypeManager.class){
if(propoManager == null){
propoManager = new PrototypeManager();
}
}
}
return propoManager;
} /**
* 存放键值对
* @param key
* @param value
*/
public void setProtoType(String key, BaseProtoType value){
map.put(key, value);
} /**
* 获取克隆后的对象
* @param key
* @return
* @throws CloneNotSupportedException
*/
@SuppressWarnings("unchecked")
public <T> T getCloneProtoType(String key) throws CloneNotSupportedException{
BaseProtoType baseProtoType = map.get(key);
if(baseProtoType == null){
return null;
}
return (T)baseProtoType.clone();
}
}
PrototypeManager
PrototypeManager manager = PrototypeManager.newInstance();
NoddlesProtoType noddles = new NoddlesProtoType();
noddles.setStronger(5);
noddles.setDelicate("It's delicious..");
noddles.setLonger(8);
RiceProtoType rice = new RiceProtoType();
rice.setWater("I need more water.....");
manager.setProtoType("noddle", noddles);
manager.setProtoType("rice", rice);
NoddlesProtoType cloneNoddles = manager.getCloneProtoType("noddle");
RiceProtoType cloneRice = manager.getCloneProtoType("rice");
System.out.println("-------------");
cloneNoddles.longer();
cloneRice.getWater();
测试
---delicate---------delicate
-------------
---lonnger-----8
--water-----I need more water.....
结果
参考文摘:
《JAVA与模式》之原型模式(http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html)
创建模式--原型模式(JAVA)的更多相关文章
- java设计模式--创建模式--原型模式
原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...
- 设计模式01 创建型模式 - 原型模式(Protype Pattern)
参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...
- java-設計模式-原型模式
原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- Java进阶篇设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- Java设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
- 4.java设计模式-原型模式(prototype)
在<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更 ...
- Java设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
随机推荐
- PAT 乙级 1017 A除以B (20) C++版
1017. A除以B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过 ...
- elasticsearch 安装(基于java运行环境)
解压安装包 [root@Aliyun resource]# tar -xvf elasticsearch-5.5.2.tar.gz 添加当前主机的普通账户 [root@Aliyun resource] ...
- jQuery的效果
jQuery的效果也是极其强大的 学习方法的三要素 功能 参数 返回值 fadeout() 由可见过渡到隐藏 三个参数 第一个参数:毫秒(过渡的周期) 第二个参数:匀速(过渡的效果) 第三个参数: ...
- http note
http 多媒体传输协议 HyperText Transfer Protocol 超文本传输协议 https Hyper Text Transfer Protocol over Secure Sock ...
- Spring AOP详解和实现方式
一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...
- ZooKeeper系列(7):ZooKeeper一致性原理
一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示. 图 1.1 ZooK ...
- 用tmux工具给linux命令行分栏
介绍 有时候我们需要在命令行里同时开多个程序,但是每个程序都会占用命令行,这时候可以用tmux,给命令行界面分栏. 基本概念 tmux是分多层的 会话>窗口(我下文称作:页)>面板(或者叫 ...
- PHP微信公众号开发之自动回复
先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...
- phalcon断点调试(phpStorm+xdebug)
1.下载并添加chrome插件xdebug helper,下载地址:http://www.downcc.com/soft/261091.html 2.php添加xdebug扩展 mkdir -p /u ...
- Ruby学习笔记6: 动态web app的建立(3)--多Model之间的交互
We first built a static site which displayed a static image using only a Controller and a View. This ...