前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图图谈设计模式_原型设计模式_java

图图谈设计模式_原型设计模式_java

作者头像
一头小山猪
发布2020-04-10 11:01:41
4300
发布2020-04-10 11:01:41
举报
文章被收录于专栏:微光点亮星辰

嗨,今天天气大幅度降温,大家注意保暖哦!

时间过的真快,今天将是创建型结构中的最后一个设计模式了---原型设计模式。

官方概述:

代码语言:javascript
复制
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

小编简单的说就是我们就是把对象复制一份不去new啦。

那为什么呢,原因很简单,效率高。最近做项目就用到该模式,实体A关联实体B,B关联实体C。而通过实现序列化和反序列化的深度复制,只需复制A,那么关联的对象都可以同时复制成功,前提是实现Serializable接口,一种jdk规范。

工具类如下:

代码语言:javascript
复制
/**
     * 深度复制
     * @param source 源对象
     * @return 目标对象
     */
    public static Serializable deeplyCopy(Serializable source) {
        if(source == null) {
            return source;
        }
        Serializable target = null;
   //1.声明四个流对象的变量
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bais = null;
        ByteArrayOutputStream baos = null;
  //2.try...catch...finally结构
        try{
            //3.创建字节数组的输出流
            baos = new ByteArrayOutputStream();
 //4.创建对象输出流
            oos = new ObjectOutputStream(baos);
 //5.执行序列化操作:将对象序列化后得到的数据写入baos,更本质的来说,是通过baos写入到了字节数组中
            oos.writeObject(source);
 //6.通过baos获取字节数组
            byte[] buffer = baos.toByteArray();
 //7.根据字节数组创建字节数组的输入流
            bais = new ByteArrayInputStream(buffer);
 //8.根据字节数组输入流创建对象输入流
            ois = new ObjectInputStream(bais);
  //9.执行反序列化操作:将对象数据从字节数组中读取出来,然后恢复为对象
            target = (Serializable) ois.readObject();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
  //10.释放资源
            if(oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  //11.返回目标对象
        return target;
    }

第二种是克隆的形式,需要实现Cloneable接口

而克隆又分深复制和浅复制。

代码语言:javascript
复制
package org.huey.partten.prototype;
import java.util.Date;
/**
 * 浅复制
 * @author huey
 *
 */
public class Robot1 implements Cloneable{
     private String name;
     private Date  birthday;
     @Override
     protected Object clone() throws CloneNotSupportedException {
          Object object = super.clone();
          return object;
     }
     public Robot1() {
     }
     public Robot1(String name, Date birthday) {
          super();
          this.name = name;
          this.birthday = birthday;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public Date getBirthday() {
          return birthday;
     }
     public void setBirthday(Date birthday) {
          this.birthday = birthday;
     }
     @Override
     public String toString() {
          return "Robot [name=" + name + ", birthday=" + birthday + "]";
     }
}
package org.huey.partten.prototype;
import java.util.Date;
/**
 *
 * @author huey
 *
 */
public class Client {
     public static void main(String[] args) throws CloneNotSupportedException {
          Date date = new Date(12121121);
          Robot1 robot1 = new Robot1("机器人原型", date);
          System.out.println("未修改时间原型"+robot1);
          Robot1 clone = (Robot1) robot1.clone();
          date.setTime(2121);
          robot1.setBirthday(date);
          // 比较时间是否一致,如果一致,都指向一个date对象
          System.out.println("修改时间原型"+robot1);
          System.out.println("克隆"+clone);
     }
}
代码语言:javascript
复制
package org.huey.partten.prototype;
import java.util.Date;
/**
 * 浅复制
 * @author huey
 *
 */
public class Robot2 implements Cloneable{
     private String name;
     private Date  birthday;
     @Override
     protected Object clone() throws CloneNotSupportedException {
          Object object = super.clone();
          Robot2 robot2 = (Robot2) object;
          robot2.birthday = (Date) this.birthday.clone();
          return robot2;
     }
     public Robot2() {
     }
     public Robot2(String name, Date birthday) {
          super();
          this.name = name;
          this.birthday = birthday;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public Date getBirthday() {
          return birthday;
     }
     public void setBirthday(Date birthday) {
          this.birthday = birthday;
     }
     @Override
     public String toString() {
          return "Robot [name=" + name + ", birthday=" + birthday + "]";
     }
}
package org.huey.partten.prototype;
import java.util.Date;
/**
 * 深复制
 *
 * @author huey
 *
 */
public class Client2 {
     public static void main(String[] args) throws CloneNotSupportedException {
          Date date = new Date(12121121);
          Robot2 robot2 = new Robot2("机器人原型2", date);
          System.out.println("未修改时间原型"+robot2);
          Robot2 clone = (Robot2) robot2.clone();
          date.setTime(21212);
          robot2.setBirthday(date);
    // 比较时间是否一致,如果不一致,各自拥有一个date对象
          System.out.println(robot2.getBirthday() == clone.getBirthday());
          // 内容比较
          System.out.println("修改时间后原型"+robot2);
          System.out.println("克隆"+clone);
     }
}

还是那句话,天气凉了,注意保暖哦。

创建型一个5种设计模式,下次将分享结构型的了哦。如果你没看过,往前面自己找一下吧,看准图图,看准huey。

下次见哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微光点亮星辰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档