原型模式

(4)原型模式Prototype

时光怂恿深爱的人放手 提交于 2020-02-13 12:15:39
它是这样被定义的 : 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 就像有一份写好的简历样本,现在需要复制出 N 份只有名字或年龄不同其他都相同的简历,怎么做呢?原型模式就好比一台现实生活中的复印机。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。复印机本身不知道所复印的内容,却一字不差地复印了出来。 原型模式的类型: 创建型模式(还有单件模式、工厂模式、抽象工厂模式、创建者模式) 原型模式的好处有二: 1. 比直接new一个对象在性能上要好的多,每 new 一次都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次执行这个初始化操作效率就很低,而Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。 2. 简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。 所以,一般在初始化的信息不发生变化的情况下,克隆是最好的办法。即当我们在处理一些对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。这既隐藏了对象创建的细节,又对性能是大大的提高。不用重新初始化对象,而是动态地获得对象运行时的状态。如果我们并不需要基于现有的对象复制新的对象,或者我们需要的就是一个干净的空对象,那么还是选择工厂模式或者抽象工厂模式了。

python-原型模式

六月ゝ 毕业季﹏ 提交于 2020-02-11 08:15:01
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 说明 原型模式关注的是大量相同对象或相似对象的创建问题,意图在于通过复制一个已经存在的实例来获得一个新的实例,以避免重复创建此类实例带来的开销。被复制的实例就是这个“原型”,这个原型是可定制的。 实例: 在Photoshop等平面设计的软件中,图层概念的提出,使得设计、图形修改等操作更加便利。设计师既可以修改和绘制当前图像对象,又可以保留其它图像对象,逻辑清晰,且可以及时得到反馈。示例中一图层为主角,介绍原型模式。 from copy import copy, deepcopy class simpleLayer: """    设计一个图层对象,用background表示背景的RGBA,简单用content表示内容,除了直接绘画,还可以设置透明度。   """ background=[0,0,0,0] content="blank" def getContent(self): return self.content def getBackground(self): return self.background def paint(self,painting): self.content=painting def setParent(self,p): self

Prototype原型模式

巧了我就是萌 提交于 2020-02-09 14:52:55
通过构造函数的弊端引出原型概念 先看一个一只猫的构造函数 function Cat(name,color){ this.name = name; this.color = color; this.type = "猫科动物"; this.eat = function(){alert("吃老鼠");}; } var cat1 = new Cat("大毛","黄色"); var cat2 = new Cat ("二毛","黑色"); alert(cat1.type); // 猫科动物 cat1.eat(); // 吃老鼠 表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。 再看 alert(cat1.eat == cat2.eat); //false 因此,为了让type属性和eat()方法在内存中 只生成一次 ,然后所有实例都指向那个内存地址,引出了原型 什么是原型? 原型对象实际上就是构造函数的一个实例,和普通的实力对象没有本质上的区别。可以包含特定类型的所有实例的共享属性或者方法。这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。

JavaScript原型模式(prototype)

末鹿安然 提交于 2020-02-09 14:51:49
1.原型是一个对象,其他对象可以通过它实现属性的继承所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,所以一个类的真正原型是被类的内部[prototype]属性所指出。每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。 如上图,SuperType是是一个函数,右侧的方框就是它的原型。 注:上图来自 http://www.cnblogs.com/wangfupeng1988/p/3978131.html2.什么可以称之为对象?在JavaScript中一个对象:就是任何的无序的键值对的集合function var a={}如果他不是一个主数据类型(undefined null boolean number string)其他的通通叫做对象。 JavaScript中的原型(prototype)是和函数(function紧密相连的)var o={} 他不是有用function他有原型吗? 答:必须的每一个通过new操作符生成出来的对象都持有一个属性__proto__,这个属性保存了创建他的构造函数的prototype的原型的引用。 类的扩展方式有两类共三种: 说明一下,是在原型链上层扩展出来的。两类:分为是否是function定义的类分为两种

JavaScript 创建对象的七种方式

巧了我就是萌 提交于 2020-02-09 03:57:33
JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产。接下来介绍七种非常经典的创建对象的方式,他们也各有优缺点。 工厂模式 function createPerson ( name , job ) { var o = new Object () o . name = name o . job = job o . sayName = function () { console . log ( this . name ) } return o } var person1 = createPerson ( 'Jiang' , 'student' ) var person2 = createPerson ( 'X' , 'Doctor' ) 可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象 工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型 构造函数模式 function Person ( name , job ) { this . name = name this . job = job this . sayName = function () { console . log ( this . name ) } } var

C# 设计模式———原型模式

走远了吗. 提交于 2020-02-08 20:17:08
原型模式简介 用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象,是用于创建重复的对象,同时又能保证性能。该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 原型模式: 动态获取一个类的运行状态,避免耗时new的实例化; 做对象copy 原型模式的copy只是一个浅copy,它并不能copy引用类型 深copy实现 让引用类型都实现一个Clone方法,从而手工实现这个深copy; C# BinaryFormatter通过二进制将对象的图进化序列化; 与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。 C# 原型模式 Demo using System ; using System . Collections . Generic ; namespace Prototype { class Program { static void Main ( string [ ] args ) { var person = new Person ( ) { Name = "jack" , Age = 20 , Address = new Address ( ) { Province = "陕西" , City = "渭南" }

设计模式之原型模式

谁说我不能喝 提交于 2020-02-08 08:25:13
原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并通过这些原型创建新的对象。 适用场景: 类初始化消耗的资源较多 适用new生成一个对象需要非常繁琐的过程(数据准备,权限访问) 构造函数比较复杂 在循环体中产生的大量对象 在Java中 可以通过 实现Cloneable 接口 重写clone()方法即可。 浅克隆 创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 深克隆 创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 来源: CSDN 作者: Eternal1125 链接: https://blog.csdn.net/qq_36306590/article/details/104214429

23种设计模式详讲-原型模式

孤者浪人 提交于 2020-02-08 00:23:58
一、什么是原型模式: 传统的创建的对象,可以用new直接新建对象,但是如果某些类的属性太多,这样构造起来会相对复杂;这里提供了一种不用通过构造方法,创建对象的方法;通过Jdk自带的Cloneable接口,实现对象的拷贝,创建新的对象; 二、何时使用原型模式: 原型模式其实就是一个对象在创建另一个可定制的对象,而且不需要指定任何创建的细节。Java提供了Cloneable接口,其中有一个唯一方法Clone(),实现这个接口就可以完成原型模式了。 一般在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象创建的细节,又对性能是大大的提高。不用重新初始化对象,而是动态地获得对象运行时的状态。 三、原型模式大概分为潜拷贝和深度拷贝: 1)潜拷贝: 代码示例: package com.jason.study.design.prototype.simple; import com.jason.study.design.prototype.Teacher; public class School implements Cloneable { private String name; private int id; private Teacher teacher; public String getName() { return name; } public void setName

原型模式

为君一笑 提交于 2020-02-06 07:36:43
问题描述 现在有一只羊tom,姓名为tom,年龄为1,颜色为白色,请编写程序创建和tom属性完全相同的10只羊 传统思维 直接new出一个对象 优点:比较好理解,简单易操作 缺点: 在创建新的对象的时候,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率低。 总是需要重新初始化对象,而不是动态的对象运行时的状态,不够灵活 使用原型模式 概括 原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式。允许一个对象再创建另一个可制定对象,无需知道如何创建的细节 工作原理:通过一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实现创建,即 对象.new() 思路:利用Object超类的clone()方法,可以将对象复制一份,但是实现clone()的java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制能力。 缺点:如果需要对一个类配备一个克隆方法,这对全新的类不难,但对已有的类进行改造的时候,需要修改源代码,违背了OCP(开闭)原则。 优点:简化对象创建过程,同时也能够提高效率;不用重新初始化对象,而是动态获取对象运行时状态;但对象发生变化时,克隆对象也会发生变化,无需修改代码。 实现 创建可以clone的类,实现Cloneable接口,显示重写clone方法

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

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-29 03:51:44
1. 概述   通过复制一个已经存在的实例来创建一个新的实例。被复制的实例被称为原型,这个原型是可定制的。 2. 模式中的角色   2.1 抽象原型类(Abstract Prototype):提供一个克隆接口   2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类 3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事。其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简历。复制一份简历,然后做局部修改是最让人省心的了!   3.1 实现类图      类图解读   在.NET中,System命名空间已经为我们提供了一个ICloneable接口,它包含了一个方法Clone(),实现这个接口就完成了原型模式。   3.2 在写实现代码之前,先要理解一下深复制与浅复制。     3.2.1 浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,则简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象;如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。例如, 如果一个对象有一个指向引用类型(如例子中的工作经历)的字段, 并且我们对该对象做了一个浅复制, 那麽两个对象将引用同一个引用