创建模式--原型模式(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设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
随机推荐
- 『Hi,我是易建科技eKing Cloud!』
写在前面:这是我的第一篇自我介绍式文章,是对易建科技我所在云服务事业群的云平台产品和业务的总结和介绍.本文始发于 Linux宝库 公众号,这是原文链接.感谢公众号主人陈绪总,感谢公众号的编辑们!感谢易 ...
- python图片和字符串的转换
有个业务,需要将图片压缩转化为64位编码上传到服务端. import json,requests,base64 #网上下载图片素材 r = requests.get("https://tim ...
- python打包--pyinstaller打包报错
先来一段报错信息 目前打包主要涉及socket模块出现的报错 missing module named resource - imported by posix, C:\Users\Administ ...
- python面向对象 : 继承
一. 初识继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 当我们在定义多个类的时候,发现要用到相同的方法或变量,如 ...
- 2017.7月(关于vertical-align等)
1.Jquery 可以使用$('.class',$object)的形式,$object是jQuery对象,在该对象的子元素中查找'.class' 2.line的问题,input和button作为inl ...
- 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...
- HBase的Shell命令和JavaAPI
HBase的shell操作和JavaAPI的使用: Shell 表操作 创建表 create 'student','info' #表名 列族 插入表 put 'student','1001','inf ...
- Java——ikanalyzer分词·只用自定义词库
需要包:IKAnalyzer2012_FF_hf1.jarlucene-core-5.5.4.jar需要文件: IKAnalyzer.cfg.xmlext.dicstopword.dic 整理好的下载 ...
- C,Java,C#数据类型对比总结
- CS229 6.7 Neurons Networks whitening
PCA的过程结束后,还有一个与之相关的预处理步骤,白化(whitening) 对于输入数据之间有很强的相关性,所以用于训练数据是有很大冗余的,白化的作用就是降低输入数据的冗余,通过白化可以达到(1)降 ...