GOF23设计模式之原型模式

1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式。

2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点

3)优势在于效率高(直接克隆,避免了重新执行构造过程步骤)

4)克隆类似于 new ,但是不同于 new。new 创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。

实现:

1)Cloneable 接口和 clone 方法

2)Prototype 模式中实现起来最困难的地方就算内存复制操作,所幸在 Java 中提供了 clone()方法替我们做了绝大部分的事情。

package cn.taosir.design.create.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
//直接调用object的clone方法
Object obj=super.clone();
return obj;
}
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;}
public Sheep(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
} public static void main(String[] args) throws CloneNotSupportedException {
Sheep s1=new Sheep("taosir", new Date());
Sheep s2=(Sheep)s1.clone();
System.out.println(s1==s2);
}
}

注意:上面的代码为浅克隆,其中的引用类型字段(birthday)引用的是同一个对象

package cn.taosir.design.create.prototype;

import java.util.Date;

public class Sheep2 implements Cloneable {
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
//直接调用object的clone方法
Object obj=super.clone();
//添加如下代码实现深复制
Sheep2 s=(Sheep2)obj;
s.birthday=(Date)this.birthday.clone();
return obj;
}
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;}
public Sheep2(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
} public static void main(String[] args) throws CloneNotSupportedException {
Sheep2 s1=new Sheep2("taosir", new Date());
Sheep2 s2=(Sheep2)s1.clone();
System.out.println(s1==s2);
}
}

深克隆的方式有很多,自行实现即可,如上

下面也提供使用序列化和反序列化实现深复制的代码

package cn.taosir.design.create.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date; public class Sheep3 implements Serializable,Cloneable {
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
//直接调用object的clone方法
Object obj=super.clone();
return obj;
}
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;}
public Sheep3(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
} public static void main(String[] args) throws Exception {
Sheep3 s1=new Sheep3("taosir", new Date(321321321));
System.out.println("s1的创建时间:"+s1.getBirthday()); // Sheep3 s2=(Sheep3)s1.clone();
// System.out.println("s2的创建时间:"+s2.getBirthday());
// System.out.println(s1==s2); //使用序列化和反序列化实现深复制
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(s1);
byte[] bytes=bos.toByteArray(); ByteArrayInputStream bis=new ByteArrayInputStream(bytes);
ObjectInputStream ois=new ObjectInputStream(bis);
Sheep3 s2=(Sheep3)ois.readObject(); s2.setBirthday(new Date());
System.out.println("s1的时间:"+s1.getBirthday());
System.out.println("s2的时间:"+s2.getBirthday());
}
}

GOF23设计模式之原型模式的更多相关文章

  1. 【GOF23设计模式】原型模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 package com.test.prot ...

  2. GOF23设计模式之原型模式(prototype)

    一.原型模式概述 1.通过new产生一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式. 2.就是java中的克隆技术,以某个对象为原型,复制出新的对象,显然,新的对象具备原型对象的特点. ...

  3. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  4. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  5. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  6. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  7. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  8. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  9. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

随机推荐

  1. windows下solr7.9+tomcat7环境搭建

    1.下载solr.tomcat(能够不用下载.由于solr有jetty支持) 2.solr部署到tomcat上    首先,把解压包下的solr-4.9.0\example\solr-webapp中的 ...

  2. ListView无障碍识别整个listView,不识别item,设置了setContentDescription也没实用

    点击ListView的时候.无障碍识别到的是整个listView,不会读点击的那个item. 解决的方法是在getView里手动设置: <span style="font-size:1 ...

  3. log4net preserveLogFileNameExtension 和 watch

    preserveLogFileNameExtension <log4net> <appender name="fileappender" type="l ...

  4. lucene 范围过滤

    Lucene里面有关于Filter的整体知识 下面,我们来看下具体的在代码里怎么实现,先来看下我们的测试数据 Java代码    id      score       bookname    ena ...

  5. poj 2142

    Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. F ...

  6. B1202 [HNOI2005]狡猾的商人 并查集

    其实就是并查集的题.维护一个前缀和,然后用并查集维护前缀和,每次判断是否合理就行了. 题干: Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了 ...

  7. [APIO2008]DNA

    https://zybuluo.com/ysner/note/1158123 题面 戳我 解析 我们要求出第\(r\)种方案,莫过于看其前面什么时候有\(r-1\)种方案. 于是,我们要求出每种情况的 ...

  8. LA4788

    贪心 这个贪心不太懂啊 dfs返回子树需要的最小值,然后按需要减消耗排序,然后贪心选取即可. #include<bits/stdc++.h> using namespace std; ty ...

  9. Thinkpad E450c开启Intel virtual technology

    1.重启系统,一直按F12,进入系统设置后,按tab进入App Menu选项卡,选择Setup按回车进入BIOS设置 2.移动到Security选项 3.移动到Virtualization,按ente ...

  10. fsockopen get,post 封装 (转)

    function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) {   $parse = pa ...