zoukankan      html  css  js  c++  java
  • 设计模式学习-原型模式

    1.定义

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    2.类图

    3.代码示例

     1 package com.zhaoyangwoo.prototype;
     2 
     3 /**
     4  * Created by john on 16/5/8.
     5  */
     6 public class Prototype {
     7     public static void main(String[] args){
     8         Product p1= new Product();
     9         p1.setName("nihao");
    10         p1.setAge(2);
    11         Product p2 = p1.clone();
    12         System.out.println(p2.getName());
    13     }
    14 }
    15 
    16 
    17 class Product implements Cloneable{
    18     String name;
    19 
    20     Integer age;
    21 
    22     public Product() {
    23         System.out.println("调用构造方法");
    24     }
    25 
    26 
    27     public String getName() {
    28         return name;
    29     }
    30 
    31     public void setName(String name) {
    32         this.name = name;
    33     }
    34 
    35     public Integer getAge() {
    36         return age;
    37     }
    38 
    39     public void setAge(Integer age) {
    40         this.age = age;
    41     }
    42 
    43     @Override
    44     public Product clone() {
    45         try {
    46             return (Product)super.clone();
    47         } catch (CloneNotSupportedException e) {
    48             e.printStackTrace();
    49         }
    50         return null;
    51     }
    52 }

    4.应用场景举例

    • 一个对象被多个对象使用并且需要修改
    • 类型需要多个对象但是对象的初始化消耗巨大 

    5.JDK源码中的模式实现

      在jdk源码中,凡事实现了Cloneable接口的类均使用了此模式。例如我们经常说的Calendar类

    public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>

    6.思考

    • 原型模式和构造函数

    java的原型模式已经在语言中实现。只需要实现Cloneable接口,该接口没有任何实现,只是一个标志。如果没有该接口但是却重写了clone方法,使用时会报异常。

    另外java中的原型是直接二进制拷贝,性能客观,这也就能说明复制出来的实体是没有执行构造函数。

    
    
    • 深复制和浅复制

    二进制流的拷贝是浅复制,对于基础类型当然生成新的备份,但是对于引用类型,新老实体对应的都是同一个引用地址。所有如果实体类有引用类型的字段,那么请在

    clone方法中重新为引用类型的字段分配空间赋值。

    作者: zhaoyanghoo
    出处: http://www.cnblogs.com/zhaoyanghoo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    android 关于双卡设置
    android apk反编译和odex转dex
    Android中获取系统内存信息以及进程信息ActivityManager的使用(一)
    ubuntu banshee music
    linux 查看文件夹大小
    嵌入式Linux学习笔记之GPIO接口
    Android中MediaButtonReceiver广播监听器的机制分析
    在Ubuntu中VirtualBox下xp使用usb设备
    beyond compare 与git diff整合
    Linux学习笔记一 Linux基础知识认知以及初识Linux下C编程入门
  • 原文地址:https://www.cnblogs.com/zhaoyanghoo/p/5470766.html
Copyright © 2011-2022 走看看