创建模式--原型模式(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设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
随机推荐
- zTree分批异步加载方式下实现节点搜索功能(转载)
原文地址:https://segmentfault.com/a/1190000004657854 最近公司做一个项目用到zTree,zTree功能强大就不用多说了,相信用过的人都知道. 公 ...
- 廖雪峰Java1-3流程控制-4switch多重选择
switch语句 根据switch(表达式)跳转到匹配的case结果,继续执行case结果: 的后续语句,遇到break结束执行,没有匹配条件,执行default语句. int i = 3 switc ...
- 免费通配符SSL证书
https://www.freehao123.com/lets-encrypt-wildcard-ssl-ssl/ 第一步:要安装 curl https://get.acme.sh | sh 或者 w ...
- 各种http报错的报错的状态码的分析
HTTP常见错误 HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表 ...
- redis-5.0.3集群搭建
首先部署redis-5.0.3,请参考我的另一篇文章 https://www.cnblogs.com/djlsunshine/p/10592174.html 启动redis服务 # redis-ser ...
- [UE4]子弹穿透多个机器人
一.将机器人的碰撞类型改成“OverLap” 二.使用“MultiLineTraceByChannel”这个是可以穿透检测,可以检测到多个物体(前提是被检测物体的碰撞类型是“OverLap”).“Li ...
- Mybatis 系列3-结合源码解析properties节点和environments节点
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- React 懒加载组件
//组件第一次初始化的时候加载. import React, {PropTypes} from 'react'; //import AppComposer from './views/App/AppC ...
- golang "text/template" 模板语法简明教程
转自:https://www.cnblogs.com/Pynix/p/4154630.html [模板标签] 模板标签用"{{"和"}}"括起来 [注释] ...
- MySql 引擎
存储引擎: 存储引擎就是指表的类型以及表在计算机上的存储方式 它处于MySQL体系架构中Server端底层,是底层物理结构的实现,用于将数据以各种不同的技术方式存储到文件或者内存中,不同的存储引擎具备 ...