原型模式

原型模式

主宰稳场 提交于 2019-11-27 03:26:13
原型模式的作用,简化new一个对象的繁琐复杂的过程。 BeanUtils.copy() JSON.parseObject() 都是原型模式。 返回结果false,可以看出t1t2的地址不同,只是将里面的属性值复制给了t2,但真的是这样么? 发现,当改变t2的classmate的时候,t1也随之改变了。 这里引出一个概念,浅克隆与深克隆。 浅克隆与深克隆的区别在于非基本对象的赋值时,浅克隆时赋值的地址。深克隆则是也只是复制对象内容而不是指向的地址。 可以采用流的方式完成深克隆 返回结果: 这样就能完成深克隆了! 来源: https://blog.csdn.net/fox_233/article/details/99316089

原型模式

拈花ヽ惹草 提交于 2019-11-27 01:26:53
解决的问题: 当前线程定时对集合中的元素,遍历执行一次操作,而在遍历的过程中,其他的线程可能会增删元素,这样的话,就会导致foreach的内部状态发生变化,出现异常。 解决办法: 定时器每次执行的时候,对集合做一个拷贝,对这个拷贝遍历。其他线程还是对原来的集合做增删操作,不会相互影响。而且即使其他线程,做了增删操作,在定时器也会对所有元素都会执行。 转载于:https://www.cnblogs.com/nzbbody/p/3309420.html 来源: https://blog.csdn.net/weixin_30477293/article/details/99234419

原型(Prototype)模式

百般思念 提交于 2019-11-27 00:56:04
   原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原型模式的用意。 原型模式的结构   原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。 原型模式有两种表现形式:简单形式、登记形式,这两种表现形式仅仅是原型模式的不同实现。 简单形式的原型模式   这种形式涉及到三个角色: 客户(Client)角色:客户类提出创建对象的请求。 抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。 具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。 源代码 //@类说明 :抽象原型角色 public interface Prototype { //@return 一个从自身克隆出来的对象 public Prototype clone(); } // @类说明 :具体原型角色 public class ConcretePrototype1 implements

原型模式

99封情书 提交于 2019-11-27 00:55:27
意图: 用原型实例指定创建对象的种类,及复制这些原型来创造新的对象。 结构图: 在应用工厂模式创建对象时,需要为工厂类建立与产品类相同的继承层次,就算所有的产品都属于同一种类,相互之间只存在很小的差异,我们也不得不派生出许多工厂子类来生产这些产品。 为了减少这种子类化工作,也可以采用在创建对象时传入参数,来选择创建何种对象,但是这无疑增加了生产者和产品耦合性,使得再要增加或者修改产品种类,变得不够方便。并且,系统如何传入适当的参数以生产不同产品也存在问题。 那么,原型模式的引入,就可以解决这两方面的问题。 原型模式通过对原型实例的复制来创建新的对象,Prototype类,为一个抽象类,用以定义一个抽象接口Clone()方法,该方法由具体的派生类实现: class Prototype{ public : virtual Prototype* Clone(); } 派生类实现Clone接口: class ConcretePrototype1: public Prototype{ public: ConcretePrototype1* Clone(){return copy of self} } ConcretePrototype1* cnrtProtyp1 = new ConcretePrototype1(); 系统中,通过对实例化的Prototype对象调用Clone函数

JS原型+原型链+设计模式

夙愿已清 提交于 2019-11-27 00:55:00
JavaScript 是一种基于对象的语言, JavaScript 中的所有对象,都具有 prototype 属性。 prototype 属性返回对象的所有属性和方法,所有 JavaScript 内部对象都有只读的 prototype 属性,可以向其原型中动态添加属性和方法,但该对象不能被赋予不同的原型。但是自定义的对象可以被赋给新的原型。 对象分为函数对象和普通对象,区分:凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。(Object ,Function 是JS自带的函数对象) 1.原型对象: prototype 在JS 中,函数对象其中一个属性:原型对象 prototype。普通对象是没有prototype属性,但有__proto__属性。 原型的作用就是给这个类的每一个对象都添加一个统一的方法,在原型中定义的方法和属性都是被所以实例对象所共享。   例:      var person = function(name){        this.name = name      };      person.prototype.getName = function(){//通过person.prototype设置函数对象属性        return this.name;      }      var zxj= new person(

原型模式

吃可爱长大的小学妹 提交于 2019-11-27 00:54:22
有的时候,我们需要一个实例时, 并且,当创建一个实例的过程比较复杂或者说是昂贵时, 比如,创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间, 同时呢,这个构造函数中的一些信息又没有什么变化 (也就是说创建第一个实例时初始化信息是这样的,创建第二个实例时初始化信息还是还是这样的), 那么直接使用 new 来 创建这样一个实例就显得太昂贵了, 最好的解决方法,并不是使用 new 来实例化一个对象, 而是使用克隆,也就是复制,克隆呢,就是通过复制现在已经有了的实例来创建新的实例, 这样有什么好处呢? 很明显,这样实现呢,客户端根本就不知道具体要实例化的是哪一个类, 它只知道是复制了,但具体的实例化情况,它却是一无所知的,这样便对客户端进行了隐藏, 同时,复制一个对象一般情况下会比创建一个对象性能更高(当然有时候也不一定,只是一般情况而已), 其实上面所提到的就是下面要介绍的一个设计模式--原型模式(Prototype), 原型模式(Prototype) 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的实例。 换句话说,原型模式就是通过复制现在已经存在的对象来创建一个新的对象。 原型模式的结构类图如下: 从上面这副类图中,可以看出,在 AbstractPrototype 中只声明了一个方法,那就是克隆自身。 下面我们就来看一看原型模式的具体实现:

原型模式

流过昼夜 提交于 2019-11-27 00:04:23
一、内容 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。 浅拷贝( Shallow Copy ):指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。 深拷贝( deep copy ):对对象实例中字段引用的对象也进行拷贝。 二、代码实例 import copy from collections import OrderedDict class Book: def __init__(self, name, authors, price, **rest): '''rest的例子有:出版商、长度、标签、出版日期''' self.name = name self.authors = authors self.price = price # 单位为美元 self.__dict__.update(rest) def __str__(self): mylist = [] ordered = OrderedDict(sorted(self.__dict__.items())) for i in ordered.keys(): mylist.append('{}: {}'

JavaScript学习

萝らか妹 提交于 2019-11-26 18:10:53
一、JavaScript 简介 一、JavaScript语言的介绍:JavaScript是 基于对象和原型 的一种 动态、弱类型 的 脚本语言 二、JavaScript语言的组成: JavaScript是由核心语法(ECMAScript)、文档对象模型(DOM)、浏览器对象模型(BOM)组成的 三、JavaScript语言的应用: 实现页面表单验证以及页面交互特效,基于Node.js技术进行服务器端编程等 二、JavaScript ECMAScript 一:基础语法 一:变量 1. 变量的声明 1. var变量:var 变量名 = 值; 2. let变量:let 变量名 = 值; 3. const变量:const 变量名 = 值; 2. 变量的作用域 1. 全局作用域:代码中任何地方都能访问到 2. 局部作用域:在固定的代码片段内可访问到 3. 变量提升:变量在声明之前就访问,var会使用默认值undefined,而let会直接报错 4. var、let、const区别 二:运算符 1. 算数运算符:加(+),减(-),乘(*),除(/),求余(%) 2. 赋值运算符:=,+=,-=,*=,%= 3. 关系运算符:>,<,>=,<=,==(只比较值),!=,===(值和数据类型都比较) 4. 逻辑运算符:[&&,||](只有左侧满足才计算右侧),!,[&,|](不管左侧结果如何

设计模式之GOF23原型模式02

99封情书 提交于 2019-11-26 17:58:52
利用序列化和反序列化完成深复制 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 s3=(Sheep3) ois.readObject(); 原型模式的与工厂模式相结合 工厂模式new出来的对象可以变为Clone出来的 new方式和Clone方式创建1000个对象的比较(配置低版本) public class Test { public static void testNew(int size) { long start =System.currentTimeMillis(); for(int i=0;i<size;i++) { Iphone iphone=new Iphone(); } long end =System.currentTimeMillis(); System.out

设计模式之GOF23原型模式01

穿精又带淫゛_ 提交于 2019-11-26 17:52:10
原型模式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