原型模式

设计模式之原型模式、策略模式、观察者模式

こ雲淡風輕ζ 提交于 2019-12-04 14:46:41
一、原型模式 1、什么是原型模式 克隆 原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。 2、原型模式应用场景 (1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 (2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 (3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。 Spring框架中的多例就是使用原型。 3、原型模式UML类图(通用) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 (2

原型模式

∥☆過路亽.° 提交于 2019-12-03 13:51:40
1. 原型模式简介 原型模式属于创建型模式,其主要作用就是用一个对象创建出新的对象,既简化了对象的创建过程,又对外隐藏创建细节。通常我们会使用new关键字来创建对象,但是当对象构造方法接受大量参数,或者需要设置大量字段时,代码就会显得冗长。这时大家可能会想到使用工厂模式将对象的创建与使用分离,但是工厂模式会造成类膨胀,当产品比较多时,会导致项目中充斥着大量的产品类和工厂类。原型模式给我们指出另一条路,即克隆,复制一个一模一样的自己,从而达到创建新对象的目的。 在java中,一切类都是Object类的子类型,Object类为我们提供了clone()方法,因此,当我们需要克隆一个实例时,直接调用clone()方法就行了。但是clone()方法有几个限制: ①调用clone()方法的对象需要实现Cloneable接口。Cloneable只是一个符号接口,本身不包含任何方法声明,它的作用仅仅是说明实现这个接口的类能够使用clone()方法。 ②clone()只能实现浅拷贝,不能实现深拷贝。浅拷贝是只对基本数据类型进行复制,而对于包含引用的对象进行拷贝时,则只是将引用复制一份,复制出来的引用于原对象的引用指向的是同一个内存地址。实现深拷贝有几种方式,一是实现Serializable接口;二是覆盖clone()方法,但是当类包含的引用类型较多时,会写很多额外的代码;参考 Java深拷贝与序列化

原型模式

人盡茶涼 提交于 2019-12-03 13:24:59
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 介绍 意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 主要解决: 在运行期建立和删除原型。 何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 如何解决: 利用已有的一个原型对象,快速地生成和原型对象一样的实例。 关键代码: 1、实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。 2、原型模式同样用于隔离类对象的使用者和具体类型(易变类

原型模式

痴心易碎 提交于 2019-12-03 11:04:18
克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom 羊 属性完全相同的10只羊。 传统方式解决克隆羊问题 1) 思路分析(图解) (类图中少了 一个 color 属性) 2) 代码演示 public class Client{ public static void main(String[] args){ //传统方法 Sheep sheep=new Sheep(“tom”,1,“白色”); Sheep sheep1=new Sheep(shep.getName(),shep.getAge(),shep.getColor()); Sheep sheep2=new Sheep(shep.getName(),shep.getAge(),shep.getColor()); Sheep sheep3=new Sheep(shep.getName(),shep.getAge(),shep.getColor()); } } 传统的方式的优缺点 1) 优点是比较好理解,简单易操作。 2) 在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率较低 3) 总是需要重新初始化对象,而不是动态地获得对象运行时的状态 , 不够灵活 4) 改进的思路分析 思路:Java 中 Object 类是所有类的根类,Object

原型模式

匿名 (未验证) 提交于 2019-12-03 00:19:01
原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式其实就是从一个对象在创建另外一个可定制的对象,而且不需要知道任何创建的细节, 实现Cloneable接口: Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 重写Object类中的clone方法: Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,原型类需要将clone方法的作用域修改为public类型。 创建一个简历,并复制简历 public class Resume implements Cloneable { private String name, sex, age, timeArea, company; public Resume (String name) { this .name = name; } public void setPersonInfo (String sex,String age){ this .sex = sex; this .age = age; } public

js中创建对象方式----原型模式

匿名 (未验证) 提交于 2019-12-02 23:36:01
一、什么是原型模式 在js中,创建对象的方式有工厂模式和构造函数模式等; 而构造函数模式最大的问题在于:构造函数中的每个方法都需要在实例对象中重新创建一遍,不能复用,所以为了解决这一个问题,就需要使用原型模式来创建对象。 原型模式是把所有实例共享的方法和属性放在一个叫做prototype(原型)的属性中 ,在创建一个函数时都会有个prototype属性, 这个属性是一个指针,指向一个对象,是通过调用构造函数而创建的那个对象实例的原型对象。 // 构造函数 function Person() {}; // 原型属性prototype Person . prototype . name = '张三' ; Person . prototype . sayName = function () { console . log ( this . name ); }; let person1 = new Person (); person1 . sayName (); //张三 let person2 = new Person (); person2 . sayName (); // 张三 console . log ( person1 . sayName == person2 . sayName ); //true 理解原型对象 无论什么时候,只要创建了一个新函数

设计模式——原型模式

自古美人都是妖i 提交于 2019-12-02 22:55:11
设计模式 中,单例模式应该是大家最为熟悉的了,那如果我们需要对一个对象进行多次复制的话,大家会用什么呢?这就要用到今天要讲的原型模式了。 简介 其定义为: 使用原型实例指定将要创建的对象类型,通过复制这个实例创建新的对象。 具体来说就是,通过给出一个原型对象来指明所创建的对象的类型,然后使用自身实现的克隆接口来复制这个原型对象,该模式就是用这种方式来创建出更多同类型的对象。 这样的好处是: Object 类的 clone() 方法是一个本地方法,它可以直接操作内存中的二进制流,所以性能相对 new 实例化来说,更加优秀。 一个对象通过 new 实例化创建过程为: 在内存中开辟一块空间。 在开辟的内存空间中创建对象。 调用对象的构造函数进行初始化对象。 而一个对象通过 clone() 创建过程为: 根据原对象内存大小开辟一块内存空间。 复制已有对象,克隆对象中所有属性值。 相对 new 来说,clone() 少了调用构造函数。如果构造函数中存在大量属性初始化或大对象,则使用 clone() 的复制对象的方式性能会好一些。 简单例子 让我们通过一个例子来具体了解一下: /** * 实现Cloneable 接口的原型抽象类Prototype */ public class Prototype implements Cloneable { /** * 重写 clone() 方法 */

设计模式——原型模式

我的梦境 提交于 2019-12-02 22:23:44
设计模式中,单例模式应该是大家最为熟悉的了,那如果我们需要对一个对象进行多次复制的话,大家会用什么呢?这就要用到今天要讲的原型模式了。 简介 其定义为: 使用原型实例指定将要创建的对象类型,通过复制这个实例创建新的对象。 具体来说就是,通过给出一个原型对象来指明所创建的对象的类型,然后使用自身实现的克隆接口来复制这个原型对象,该模式就是用这种方式来创建出更多同类型的对象。 这样的好处是: Object 类的 clone() 方法是一个本地方法,它可以直接操作内存中的二进制流,所以性能相对 new 实例化来说,更加优秀。 一个对象通过 new 实例化创建过程为: 在内存中开辟一块空间。 在开辟的内存空间中创建对象。 调用对象的构造函数进行初始化对象。 而一个对象通过 clone() 创建过程为: 根据原对象内存大小开辟一块内存空间。 复制已有对象,克隆对象中所有属性值。 相对 new 来说,clone() 少了调用构造函数。如果构造函数中存在大量属性初始化或大对象,则使用 clone() 的复制对象的方式性能会好一些。 简单例子 让我们通过一个例子来具体了解一下: /** * 实现Cloneable 接口的原型抽象类Prototype */ public class Prototype implements Cloneable { /** * 重写 clone() 方法 */

设计模式(二)——原型模式

这一生的挚爱 提交于 2019-12-02 07:09:22
原型模式是用于创建重复的对象,同时能保证性能,属于创建型模式,提供了一种创建对象的最佳方式。 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 主要解决:在运行期间创建和删除原型。 优点:提高性能,逃避了构造函数的约束。 #region 原型模式 public abstract class PrototypeClass { public PrototypeClass(string Name) { this.Name = Name; } public string Name { set; get; } public abstract PrototypeClass Clone(); } public class Prototype1 : PrototypeClass { public Prototype1(string Name) : base(Name) { } public override PrototypeClass Clone() { return (PrototypeClass)this.MemberwiseClone(); } } public class Prototype2 : PrototypeClass { public Prototype2(string Name) : base(Name) { } public override

原型模式(c#)

末鹿安然 提交于 2019-12-02 05:54:46
运行效果 代码 using System; namespace 原型模式 { class Program { static void Main(string[] args) { Console.WriteLine("原型模式"); Client client = new Client(); client.mian(); Console.ReadLine(); } } public interface ITank { void run(); ITank clone(); void setSpeed(int speed); } public class Tank : ITank { public Tank(int speed) { setSpeed(speed); } public int speed = 0; public ITank clone() { return new Tank(speed); } public void run() { Console.WriteLine("速度:" + speed); } public void setSpeed(int speed) { this.speed = speed; } } public class Client { public void mian() { const int num = 10; const int