博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原型设计模式
阅读量:7145 次
发布时间:2019-06-29

本文共 2922 字,大约阅读时间需要 9 分钟。

hot3.png

1、比较简单的设计模式,在项目中使用的场景非常多

  • 通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象

2、原型模式有两种表现形式:

(1)简单形式

84a55d9425fd3e2eb5cf422896de801d306.jpg

(2)登记形式

91635e77e41509fd54249c1af291a0bb63a.jpg

  • PrototypeManager 
public class PrototypeManager {    /**     * 用来记录原型的编号和原型实例的对应关系     */    private static Map
map = new HashMap
(); /** * 私有化构造方法,避免外部创建实例 */ private PrototypeManager(){} /** * 向原型管理器里面添加或是修改某个原型注册 * @param prototypeId 原型编号 * @param prototype 原型实例 */ public synchronized static void setPrototype(String prototypeId , Prototype prototype){ map.put(prototypeId, prototype); } /** * 从原型管理器里面删除某个原型注册 * @param prototypeId 原型编号 */ public synchronized static void removePrototype(String prototypeId){ map.remove(prototypeId); } /** * 获取某个原型编号对应的原型实例 * @param prototypeId 原型编号 * @return 原型编号对应的原型实例 * @throws Exception 如果原型编号对应的实例不存在,则抛出异常 */ public synchronized static Prototype getPrototype(String prototypeId) throws Exception{ Prototype prototype = map.get(prototypeId); if(prototype == null){ throw new Exception("您希望获取的原型还没有注册或已被销毁"); } return prototype; }}
  • 客户端代码:
public class Client {    public static void main(String[]args){        try{            Prototype p1 = new ConcretePrototype1();            PrototypeManager.setPrototype("p1", p1);            //获取原型来创建对象            Prototype p3 = PrototypeManager.getPrototype("p1").clone();            p3.setName("张三");            System.out.println("第一个实例:" + p3);            //有人动态的切换了实现            Prototype p2 = new ConcretePrototype2();            PrototypeManager.setPrototype("p1", p2);            //重新获取原型来创建对象            Prototype p4 = PrototypeManager.getPrototype("p1").clone();            p4.setName("李四");            System.out.println("第二个实例:" + p4);            //有人注销了这个原型            PrototypeManager.removePrototype("p1");            //再次获取原型来创建对象            Prototype p5 = PrototypeManager.getPrototype("p1").clone();            p5.setName("王五");            System.out.println("第三个实例:" + p5);        }catch(Exception e){            e.printStackTrace();        }    }}

3、两种形式的比较

  • 如果需要创建的原型对象数目较少而且比较固定的话,可以采取第一种形式
  • 如果要创建的原型对象数目不固定的话,可以采取第二种形式

4、利用序列化实现深度克隆

  • 把对象写到流里的过程是序列化(Serialization)过程
  • 把对象从流中读出来的过程则叫反序列化(Deserialization)过程
  • 写到流里的是对象的一个拷贝,而原对象仍然存在于JVM里面
public  Object deepClone() throws IOException, ClassNotFoundException{        //将对象写到流里        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bos);        oos.writeObject(this);        //从流里读回来        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bis);        return ois.readObject();    }

5、优点:

  • 原型模式允许在运行时动态改变具体的实现类型
  • 克隆一个原型就类似于实例化一个类

6、缺点:

  • 每一个类都必须配备一个克隆方法
  • 配备克隆方法需要对类的功能进行通盘考虑
  • 对于全新的类来说不是很难,而对于已经有的类不一定很容易

转载于:https://my.oschina.net/u/3847203/blog/1833575

你可能感兴趣的文章
UBOOT到内核到文件系统设置需要注意点
查看>>
卡尔曼滤波简介——4.方差比较
查看>>
mysql -- 预处理语句
查看>>
Silverlight如何调用淘宝API
查看>>
ESP8266- AP模式的使用
查看>>
hdu 1503 LCS输出路径【dp】
查看>>
博客园开张第一天
查看>>
java绘图
查看>>
The Semantic Web, Linked Data and Open Data
查看>>
用PHP逐行读取TXT文件
查看>>
从Android中Activity之间的通信说开来[转]
查看>>
SSH 常用命令
查看>>
模型思维_第1-4课_学习笔记
查看>>
linkin大话面向对象--方法详解
查看>>
Linkin大话Java和internet概念
查看>>
Linux指令--cp
查看>>
.Net多线程
查看>>
【物联网智能网关-01】通过AD采集获取温湿度
查看>>
网络和网络互联
查看>>
Python任意字符集转换
查看>>