原型模式
来源:互联网 发布:解压缩工具 for mac 编辑:程序博客网 时间:2024/05/20 01:44
原型模式
定义一个复制接口,实体类去实现接口,创建实体类,使用实体类的复制方法创建新对象,可以避免new对象.避免系统开销, 也可以将原对象的属性值都继承下来.
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
当创建新对象开销较大时,可以使用该模式,但是该模式绕过了构造函数的限制。
UML
例:
需求:
写一份简历,可以方便更新工作经历
代码实现:
简历类
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class Resume implements Cloneable,Serializable{ /** * */ private static final long serialVersionUID = 5465341684135145L; private String name; private String age; private String sex; private Work work; public Work getWork() { return work; } public void setWork(Work work) { this.work = work; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } /** * 浅复制 * */ @Override public Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } /** * 深复制 * return * @throws Exception */ public Object deepClone() throws Exception{ // 序列化 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(); } @Override public String toString() { // TODO Auto-generated method stub System.out.println("姓名:"+name+",年龄:"+age+",性别:"+sex); work.toString(); return null; }}
工作经历类:
import java.io.Serializable;public class Work implements Serializable{ /** * */ private static final long serialVersionUID = 4875412545845L; private String company; private String timeArea; public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String getTimeArea() { return timeArea; } public void setTimeArea(String timeArea) { this.timeArea = timeArea; } @Override public String toString() { // TODO Auto-generated method stub System.out.println("工作经历:"+timeArea+"在"+company+"工作"); return super.toString(); }}
客户端
public class Client { public static void main(String[] args) throws Exception { Resume resumeA=new Resume(); resumeA.setAge("25"); resumeA.setName("求职者"); resumeA.setSex("男"); Work workA=new Work(); workA.setCompany("腾讯"); workA.setTimeArea("2011-2015"); resumeA.setWork(workA); Resume resumeB= (Resume) resumeA.deepClone(); Work workB=resumeB.getWork(); workB.setTimeArea("2015-2017"); workB.setCompany("阿里巴巴"); resumeB.setWork(workB); resumeA.toString(); resumeB.toString(); }}
阅读全文
0 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- The Little Girl who Picks Mushrooms
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J (kmp扩展)
- JS正则表达式 ,reg.test()时,慎重全局查找/.../g属性
- 关于property文件的使用
- 【安全牛学习笔记】SMB扫描
- 原型模式
- 动态控制控件大小
- linux 安装 ffmpeg
- Ros Install---Ubuntu14.04
- 以太坊平台开源项目
- 国内TOP5数字化服务商中企动力舞动“管家服务”
- Retrofit 2.0
- 服务注册与发现
- 了解负载均衡