设计模式学习(四) 原型模型

使用场景

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

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

优势:

效率高(直接克隆,避免了重新执行构造的过程步骤)。

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

原型模式实现:

  -- Cloneable接口和clone方法

  -- ProtoType模式中实现起来最困难的地方就是内存复制操作,所幸在java中提供了clone方法替我们做的绝大部分事情

浅复制代码:

package com.lp.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();//直接调用Object的clone方法
        return obj;
    }

    public Sheep(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;
    }

    Sheep(){

    }

}

sheep类

package com.lp.prototype;

import java.util.Date;

public class Client {
    public static void main(String[] args) throws Exception{
        Date date = new Date(1861381234L);
        Sheep s1 = new Sheep("多利",date);
        Sheep s2 = (Sheep)s1.clone();

        date.setTime(23456789L);
        s1.setBirthday(date);

        s1.setName("少利");
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println(s1);

        System.out.println(s2.getName());
        System.out.println(s2.getBirthday());
        System.out.println(s2);
        //这里s1 和s2 的对象不同 但是值是一样的
        //浅复制只复制一个对象的值类型数据和引用的地址
        // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
    }
}

Client

结果:

这里修改了日期对象  ,他们两个的值都变化了  可见复制的不是对象的全部引用类型只是复制了引用而不是对象。

深复制代码:

package com.lp.prototype;

import java.util.Date;

public class Sheep implements Cloneable {
    private String name;
    private Date birthday;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();//直接调用Object的clone方法

        //添加如下代码实现深复制
        Sheep s = (Sheep)obj;
        s.birthday= (Date)this.birthday.clone();

        return obj;
    }

    public Sheep(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;
    }

    Sheep(){

    }

}

sheep

package com.lp.prototype;

import java.util.Date;

public class Client {
    public static void main(String[] args) throws Exception{
        Date date = new Date(1861381234L);
        Sheep s1 = new Sheep("多利",date);
        Sheep s2 = (Sheep)s1.clone();

        date.setTime(23456789L);
        s1.setBirthday(date);

        s1.setName("少利");
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println(s1);

        System.out.println(s2.getName());
        System.out.println(s2.getBirthday());
        System.out.println(s2);
        //这里s1 和s2 的对象不同 但是值是一样的
        //浅复制只复制一个对象的值类型数据和引用的地址
        // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
    }
}

client

结果:

这样就可以实现深复制了

时间: 2024-10-12 17:23:50

设计模式学习(四) 原型模型的相关文章

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

设计模式学习-原型模式

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&q

设计模式学习笔记——原型模式

1.特点:在初始化信息不发生变化时考虑. 2.概念:通过复制一个已经存在的实例来创建一个新的实例.被复制的实例被称为原型,这个原型是可定制的. 3.类图: 4.程序实现: /// <summary> /// 实现了ICloneable接口的简历类 /// </summary> public class Resume:ICloneable { public Resume() { mWorkExperience = new WorkExperience(); } private str

设计模式学习之原型模式

原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 首先了解原型模式之前我们先理解一下Cloneable这个类: Cloneable接口没有定义成员.它通常用于指明被创建的一个允许对对象进行位复制(也就是对象副本)的类.如果试图用一个不支持Cloneable接口的类调用clone( )方法,将引发一个CloneNotSupportedException异常.当一个副本被创建时,并没有调用被复制对象的构造函数.副本仅仅是原对象的一个简单精确的拷贝. 原型模式的优点: 性

设计模式学习笔记--原型模式

1 using System; 2 3 namespace Prototype 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/24 19:46:36 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// WorkExperience说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public class

最大熵学习笔记(四)模型求解

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

设计模式学习总结系列应用实例

1.单例模式 应用实例:1.一个党只能有一个主席.2.Windows是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行.3.一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件. 2.工厂模式 应用实例:1.你需要一辆汽车,你可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现 2.Hibernate换数据库只需换方言和驱动

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一

软件开发生命周期模型 瀑布模型、增量模型、原型模型、螺旋模型、喷泉模型总结

在校期间学习过这些模型,现在来复习一下. 瀑布模型/改进的瀑布模型 虽然瀑布模型仍然存在很多的问题有待解决,但瀑布模型仍然是最基本的和最效的一种可供选择的软件开发生命周期模型.瀑布模型要求软件开发严格按照需求 ->分析->设计->编码->测试的阶段进行,每一个阶段都可以定义明确的产出物和验证准则.瀑布模型在每一个阶段完成后都可以 组织相关的评审和验证,只有在评审通过后才能够进入到下一个阶段. 由于需要对每一个阶段进行验证,瀑布模型要求每一个阶段都有明确的文档产出,对于严格的瀑布模型