原型模式:

原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例。比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理。 打个比方:吃面是个处理类,面是个模型对象。我们将面从锅里煮熟(模型对象的赋值加工)出来后,分到好几个碗中(克隆)。然后再根据客户的要求对克隆出的面由不同的吃面对象再加工(放辣子,放醋,盐少等等),最后呈现到每个顾客面前的面就都不一样了。

表现形式:

  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)的更多相关文章

  1. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  2. 设计模式01 创建型模式 - 原型模式(Protype Pattern)

    参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...

  3. java-設計模式-原型模式

    原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...

  4. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  5. Java进阶篇设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  6. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  7. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  8. 4.java设计模式-原型模式(prototype)

    在<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更 ...

  9. Java设计模式之三建造者模式和原型模式

    建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...

随机推荐

  1. python programming作业5

      # -*- coding: utf-8 -*- class ageError(Exception): pass class salaryError(Exception): pass class s ...

  2. python图片和字符串的转换

    有个业务,需要将图片压缩转化为64位编码上传到服务端. import json,requests,base64 #网上下载图片素材 r = requests.get("https://tim ...

  3. 6行代码解决golang TCP粘包

    转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...

  4. Linux聚合网络

    Linux聚合网络 作者:Eric 微信:loveoracle11g 链路聚合 [root@server1 ~]# ifconfig | grep eno [root@server1 ~]# ls / ...

  5. keras的LSTM函数详解

    keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias= ...

  6. CRM 更新解决方案之注意事项

    一般需要开发新功能时,企业或者软件公司往往会先从生产环境克隆出一台测试用系统. 开发人员会在测试系统中对功能进行开发或者测试. 这时当新功能开发和测试完成之后,需要将新的解决方案导入生产环境. 导入时 ...

  7. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  8. mysql sql中的一些问题,Null与空字符

    mysql中的空值,NULL,空字符 Mysql数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值 ...

  9. Mapreduce入门和优化方案

    MapReduce基本原理和高性能网络下优化: Mapreduce概述 Mapreduce式谷歌开源的一项重要技术,是一个编程模型,用来进行大数据量的计算,对于大数据量的计算通常采用的处理方式式并行计 ...

  10. Could not resolve all files for configuration;Andriod在build.gradle添加compile files()报错

    在build.gradle中添加个 compile files('libs/alipaySdk-20170922.jar') 就一直报这个错误 Error:Could not resolve all ...