原型模式

js高级-面向对象继承

狂风中的少年 提交于 2020-04-07 12:13:20
一、工厂模式创建对象及优缺点   继承就是把公共的部分抽象出来作为父类,基类。吃饭,跑步等   var a = {};  //批量创建不方便,不能重复设置公共属性的代码   //工厂模式出现了,创建10个Cat对象 每个对象都有年龄、姓名的属性,包括run方法   注意区分 js高级-函数的四种调用模式   function createCat(age,name){     var o = new Object();     o.age = age;     o.name = name;     o.run = function (){       console.log(o.name + 'running...')     }     return o;   }   var c = createCat(19,'xixi')   //缺点 c的原型 构造函数是Object 方法不共享 二、构造函数模式创建对象   function Cat(age,name){     this.name = name;     this.age = age;     this.run = function(){       console.log(this.name + 'running..')     }   }   var c1 = new Cat(19,'kk')  /

大话设计模式----原型模式

夙愿已清 提交于 2020-04-04 00:34:29
一、原型模式:用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 浅复制: 代码 @Data public class WorkExperience { private String workDate; private String company; } @Data public class Resume implements Cloneable { private String name; private String sex; private String age; private WorkExperience workExperience; public Resume(String name){ this.name = name; workExperience = new WorkExperience(); } public void setPersonalInfo(String sex, String age){ this.sex = sex; this.age = age; } public void setWorkExperience(String workDate, String company){ workExperience.setCompany(company); workExperience.setWorkDate(workDate); }

原型模式

雨燕双飞 提交于 2020-04-02 23:32:32
1、概述 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 2、结构 建造者模式包含以下3个角色 (1)Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至可以是具体实现类。 (2)ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。 (3)Client(客户类):在客户类中,让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方法创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。 3、浅克隆和深克隆 原型模式的克隆机制分为两种:浅克隆(Shallow Clone)和深克隆(Deep Clone) (1)浅克隆 在浅克隆中,当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。 (2)深克隆 在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。 4、优点 (1)当要创建的对象实例较为复杂时,使用原型对象可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。 (2)扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中

设计模式之原型模式(Prototype)详解及代码示例

☆樱花仙子☆ 提交于 2020-03-30 03:03:36
一、原型模式的定义与特点   原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。它属于 创建型 设计模式,用于创建重复的对象,同时又能保证性能(用这种方式创建对象非常高效)。   这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。 当直接创建对象的代价比较大时,则采用这种模式。 例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 二、原型模式优点 性能优良:原型模式是在内存二进制流的拷贝,要比new一个对象性能好很多,特别是在一个循环体类产生大量对象的时候更加明显。 逃避构造函数的约束:这是优缺点共存的一点,直接在内存中拷贝,构造函数是不会执行的。 三、原型模式的使用场景 资源初始化场景:类初始化需要消耗非常多的资源的时候。 性能和安全要求的场景:通过new产生一个对象需要非常繁琐的数据准备和访问权限的时候。 一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而各个调用者可能都需要修改其值时考虑使用。   实际项目中原型模式很少单独出现,一般和工厂模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。 四、原型模式的结构与实现   由于 Java 提供了对象的 clone(

设计模式之原型模式(Prototype)(五)

。_饼干妹妹 提交于 2020-03-27 18:16:34
3 月,跳不动了?>>> 动机 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象” ,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变? 意图 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象 示意图 原型设计模式代码实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 原型模式 { class Program { static void Main(string[] args) { Computer computer = new Computer(); computer.name = "Dell.X5124"; computer.age = 5; computer.factory = new Factory() { name = "Dell" }; computer.factory.manage = new Manage(){ManageName = "Nick"}; Computer

创建型模式之原型模式

拥有回忆 提交于 2020-03-26 21:20:17
3 月,跳不动了?>>> 1 概述 原型模式 比较好理解,即以某个对象为原型,创建该对象的副本。我们可以不用知道对象内部的属性以及内部的状态,是 迪米特法则 的很好体现。 2 原型模式 原型模式 一般用在较为复杂对象的创建,并且希望保留对象所持有的状态。 Java 对这种对象的创建方式也是提供了原生的支持—— Object.clone() 方法。 public class Object { protected native Object clone() throws CloneNotSupportedException; } 因为 Object 是所有类的父类,所以 Java 中所有的类都可以重写 clone() 方法。当然 Object 类中的 clone() 方法也提供了 native 实现,可以直接通过 super.clone() 调用,前提是对象需要实现 Cloneable 接口,否则会报 java.lang.CloneNotSupportedException 的错误。 3 案例 3.1 浅拷贝 看下面一个例子,用 Object 类中的 clone() 方法实现复制: public class Test { public static void main(String[] args) throws CloneNotSupportedException { Job job

JavaScript创建对象的几种模式

断了今生、忘了曾经 提交于 2020-03-21 15:41:30
工厂模式    构造函数模式 问题:方法也变成多份。若把方法移到对象定义的外部。则破坏了封装性    原型模式  问题:原型中的引用对象会变成单份。被所有实例共享。      用delete关键字来删除对象实例中的值   hasOwnProperty() 对象实例中存在值,返回true   in关键字 是否可以访问到属性   hasPrototypeProperty()  是否有原型属性   对象的key方法。获取key的属性 组合构造模式和原型模式  最常用的模式      在构造函数中定义属性。在原型中定义方法 动态原型模式   在构造函数中,创建原型方法之前,先检测是否存在 寄生构造函数模式     与工厂方法一样 稳妥构造函数模式   对象实例中的属性。只能通过方法来访问    来源: https://www.cnblogs.com/amibandoufu/p/4956493.html

设计模式(三)原型模式

陌路散爱 提交于 2020-03-21 10:20:02
定义: 通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象。 Java中的对象复制/克隆分为浅复制和深复制。 一、浅复制: 我们知道,一个类的定义中包括属性和方法。属性用于表示对象的状态,方法用于表示对象所具有的行为。其中,属性既可以是Java中基本数据类型,也可以是引用类型。 Java中的浅复制通常使用clone()方式完成。 当进浅复制时, clone函数返回的是一个引用,指向的是新的clone出来的对象,此对象与原对象分别占用不同的堆空间。同时,复制出来的对象具有与原对象一致的状态。 此处对象一致的状态是指:复制出的对象与原对象中的属性值完全相等==。 下面以复制一本书为例: 1.定义Book类和Author类 Author.java class Author { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } View Code Book.java class Book

原型模式(Prototype Pattern)

馋奶兔 提交于 2020-03-20 08:11:04
原型模式( Prototype Pattern ) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 模式的本质就是不断重复出现的问题的可重用解决方案。 (1) 原型实现 Person 类 public class Person : ICloneable { private string name; private string sex; private string age; private string timeArea; private string company; public Person( string name) { this .name = name; } public void SetPersonInfo( string sex, string age) { this .sex = sex; this .age = age; } public void SetWorkExperience( string timeArea, string company) { this .timeArea = timeArea; this .company = company; } public void Show() { Console .WriteLine( "{0},{1},{2}" ,name,sex,age); Console .WriteLine( "

Head First设计模式之目录

风格不统一 提交于 2020-03-18 07:33:41
一、定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。 二、结构图 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。 三、实现 namespace DesignPatterns.Prototype { class Program { static void Main(string[] args) { List<string>