原型模式prototype

原型模式:

- 通过new产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式,比如如果new对象所需时间过长,可以通过克隆产生相同的副本

- Java中的克隆技术,就是以某个对象为原型,复制出新的对象,显然新的对象剧本原型对象的特点

- 克隆类似new但是并不相同,new出的对象都是默认值,克隆出来的对象的属性值与原型对象相同。浅复制时,复制出的对象的属性如果是引用的类型,则指向同一地址;深复制时,    复制出的对象的属性与原型对象属性的引用不应指向同一地址,这就保证了修改原型或副本属性值时,不会影响另一对象

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

原型模式实现步骤:

- Clongable接口(空接口)与重写clone方法

- 深复制时需要调用属性引用对象的clone方法

/**原型模式(浅克隆)
 * 属性中的引用对象不进行复制(指向同一块内存)
 * @author 小帆敲代码
 *
 */
public class Sheep implements Cloneable{
  private String name;
  private Date birthday;
  
  @Override
  protected Object clone() throws CloneNotSupportedException {
  return super.clone();
  }
  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) {
   this.name = name;
   this.birthday = birthday;
  }
  public Sheep() {
  }
}

/**
 * 深复制(deep clone)
 * @author 小帆敲代码
 *
 */
public class SheepDeep implements Cloneable {
 private String name;
 private Date birthday;
 
 @Override
 protected Object clone() throws CloneNotSupportedException {
  Object obj=super.clone();
  SheepDeep sd=(SheepDeep)obj;
  Date d=(Date) sd.getBirthday().clone();//属性也克隆一份
  sd.setBirthday(d);
 return sd;
 }
 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 SheepDeep(String name, Date birthday) {
  this.name = name;
  this.birthday = birthday;
 }
 public SheepDeep() {
}
}

客户端

public class Client {
  public static void main(String[] args) throws Exception {
   Date d=new Date(132328888L);
   Sheep s1=new Sheep("多利",d);
   System.out.println(s1);
   System.out.println(s1.getBirthday());
   
   Sheep s2=(Sheep) s1.clone();
   System.out.println(s2);
   System.out.println(s2.getBirthday());
   //测试浅复制,复制的不是值而是引用对象的地址

//注意顺序
   Sheep s3=(Sheep) s1.clone();
   d.setTime(47388989L);
   System.out.println(s3);
   System.out.println(s3.getBirthday());
  }
}

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

  1. 设计模式之GOF23原型模式02

    利用序列化和反序列化完成深复制 ByteArrayOutputStream bos=new ByteArrayOutputStream();  ObjectOutputStream oos=new O ...

  2. 设计模式之GOF23代理模式01

    代理模式 核心作用: -通过代理,控制对对象的访问 -可以详细控制机制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做 后置处理(AOP的微观实现) 应用场景 -安全代理:屏蔽 ...

  3. java23种设计模式——四、原型模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  4. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

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

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

  6. 设计模式学习心得<原型模式 Prototype >

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...

  7. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  8. 大话设计模式Python实现-原型模式

    原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/env python # -*- c ...

  9. 重学 Java 设计模式:实战原型模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...

随机推荐

  1. CSS属性中的display属性浅谈;

    首先我们要知道什么是块级元素和行内元素有什么区别: 承接上篇文章:(浅谈HTML和body标签) 块级元素:浏览器解析为独占一行的元素(例如:div.table.ul等.),浏览器会在该元素的前后显示 ...

  2. Springboot:属性常量赋值以及yml配置文件语法(四)

    方式一: 注解赋值 构建javaBean:com\springboot\vo\Dog 1:@Component:注册bean到spring容器中 2:添加get set toString方法 3:使用 ...

  3. ADO.NET(一)

    最近在公司有用到了ADO.NET技术,由浅入深的复习一下. 如图所示,水源就像一个水库,进水龙头就像Connection,同理,抽水机:Command,输水管:DataAdapter 或 DataRe ...

  4. ADO.NET(二)

     对Command的拓展延伸 执行SQL语句. Command 对象需要取得将要执行的SQL语句,通过调用该类的多种方法,向数据库提交SQL语句. ExecuteNonQuery(),ExecuteR ...

  5. Apk优化极致

    1. webp WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知 ...

  6. 关于flex弹性布局

    http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

  7. 作业九——DFA最小化,语法分析初步

  8. 【JAVA基础】08 面向对象3

    1. 多态 多态polymorhic概述 事物存在的多种形态. 多态前提 要有继承关系 要有方法重写 要有父类引用指向子类对象 案例演示 代码体现多态 class Demo1_Polymorphic{ ...

  9. JS代码规范

    JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...

  10. JAVA第二次blog总结

    JAVA第二次blog总结 0.前言 这是我们在博客园上第二次写博客,进行JAVA阶段学习的总结.现在我们接触到JAVA已经有一段时间了,但难点还是在于编程思想和方法的改变,第二阶段的学习让我对于理解 ...