原型模式

大话设计模式之原型模式

浪尽此生 提交于 2019-11-27 23:34:21
原型模式 定义: 用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象。 实质: 就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节。 核心: (1)、实现Cloneable接口,可以使用此接口的类上使用clone方法。 (2)、重写Object类中的clone方法,因为所有类的父类是Object类,Object有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型。 结构图: 代码实现: class Resume : ICloneable//实现ICloneable接口 { private string name; private string computer; public Resume(string name) { this.name = name; } public void SetWordExperience(string computer) { this.computer = computer; } public void Display() { Console.WriteLine("{0}", name); Console.WriteLine("工作经历: {0}", computer); } public Object Clone()/

设计模式之原型模式总结

寵の児 提交于 2019-11-27 23:34:08
术语快速解释 其实原型模式说白了就是克隆,用于创建重复的对象,同时又能保证 性能 。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。 为什么能保证性能? 是因为,原型模式是在内存中的二进制流的拷贝要比直接new好,特别是要在一个很大的循环体中产生大量对象的时候,你觉得是直接复制好,还是执行一次循环再获取一次要来的快?答案显而易见。但是它也有一个显著的缺点,那就是既然是直接在内存中拷贝,那么就根本 不会执行构造函数 ,因为构造函数是用来初始化类的,而你是直接拷贝。所以需要注意这点 原型模式使用方式 克隆有两种方式浅克隆,和深克隆,当然这里介绍原型模式用到简单的深克隆。具体两者区别及高级用法用法请 移步 ,不是这里介绍的重点 实现步骤: 被复制的类需要实现Clonenable接口, 该接口为标记接口(不含任何方法) 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。 将得到的复制对象返回,如果对象中有引用对象那么对引用对象再克隆一次。 class Student implements Cloneable{ private int number; private ArrayList<String> image = new ArrayList

设计模式(十六)原型模式

眉间皱痕 提交于 2019-11-27 23:33:55
相关文章 设计模式系列 前言 公众号有同学留言设计模式,才发现好久没有写设计模式了。关于创建型设计模式只差原型模式没写了,这一篇就来填补这个空缺。 1.原型模式定义 原型模式定义 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 原型模式UML图 在原型模式中有如下角色: Client:客户端角色。 Prototype:抽象原型角色,抽象类或者接口,用来声明clone方法。 ConcretePrototype:具体的原型类,是客户端角色使用的对象,即被复制的对象。 需要注意的是,Prototype通常是不用自己定义的,因为拷贝这个操作十分常用,Java中就提供了Cloneable接口来支持拷贝操作,它就是原型模式中的Prototype。当然,原型模式也未必非得去实现Cloneable接口,也有其他的实现方式。 2.原型模式简单实现 原型模式的核心是clone方法,通过该方法进行拷贝,这里举一个名片拷贝的例子。 现在已经流行电子名片了,只要扫一下就可以将名片拷贝到自己的名片库中, 我们先实现名片类。 具体的原型类 public class BusinessCard implements Cloneable { private String name; private String company; public BusinessCard (){ System

设计模式——原型模式

非 Y 不嫁゛ 提交于 2019-11-27 23:33:41
概述: 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。如果需要短时间创建大量对象,并且new的过程比较耗时。则可以考虑使用原型模式! 优势 :效率高(直接克隆,避免了重新执行构造过程步骤) 两种方式 : 使用实现Cloneable接口的方式实现浅克隆 使用序列化和反序列化的方式实现深克隆 例子 :实现一个类的克隆 克隆羊类: import java.io.Serializable; import java.util.Date; // 克隆羊 public class Sheep implements Cloneable,Serializable { private String name; private Date birthday; public Sheep() {} 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; }

五。设计模式(原型模式)

强颜欢笑 提交于 2019-11-27 23:33:25
概念: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 1.浅复制,引用对象不进行复制。 使用环境: 1.当要实例化的类是在运行时刻指定时,例如:通过动态装载, 2.为了避免创建与产品类层次平行的工厂类层次时。 3.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工 实例化该类更方便一些。 原型模式的构成: 1.抽象的原型类(prototype):定义具有克隆自己方法的接口。 2.具体原型类(ConcretePrototype):实现具体的克隆方法。 3.客户类(Client):通过克隆生成一个新的对象。 具体代码如下: 客户端类代码: ****************************************************************** #include <QCoreApplication> #include "concreteprototype.h" #include <QDebug> int main( int argc, char *argv[]) { QCoreApplication a(argc, argv); concreteprototype *type1 = new concreteprototype ( "1" ); concreteprototype

设计模式之原型模式

匆匆过客 提交于 2019-11-27 23:33:05
一、定义 通过原型实例指定创建对象的种类,并通过拷贝这些原型实例构建新的对象。(我觉简单的说,就是一种更快更省资源的创建新的 对象的方法) 二、实例 定义什么的总是难懂,还是上实例吧! 定义一个Ball类型,实现Cloneable接口,使得这个类的对象能够被克隆。 public class Ball implements Cloneable { public int id = - 1 ; public String teststring ; public int [] num ; public ArrayList<String> list = new ArrayList<String>(); public T t ; @Override protected Object clone () throws CloneNotSupportedException { Ball ball = null ; try { ball = (Ball) super .clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return ball ; } } //T类型 class T{ public int t = 0 ; } 测试代码如下: Ball ball = new Ball(); ball.setId

spring中的原型模式

梦想与她 提交于 2019-11-27 21:31:47
大家好,我原本是神剑山庄的铸剑师,名叫小赵,本来干的好好的,后来一时兴起,睡了三少爷的小姨子,与其一直提心吊胆,干脆来个逃之夭夭。 但是,我也要吃饭的呀,工作也得找,神剑山庄去不得,还有断剑山庄、藏剑山庄、荡剑山庄、等等等等大型企业,说不定这次跳槽,能跳出个飞黄腾达! 为了提高我投简历的准确性,我觉得简历要写的多样化,不能全写一模一样,比如说我的期望薪资不能写成一样,因为我希望能够根据目标企业的情况来投递合适薪资的简历,这样中标概率大一点。  这是我的简历类: public class Resume { private String name; private String position; private int salary; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public int getSalary() { return salary; } public void setSalary

设计模式之原型模式

百般思念 提交于 2019-11-27 16:58:36
1.克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10只羊。 1.1 思路分析: 1.2 传统应用 Sheep.java public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } } Client.java public class Client { public static void main(String[] args) { //传统的方法 Sheep sheep = new Sheep("tom", 1, "白色"); Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); Sheep sheep4 = new

js高程3--面向对象的程序设计--创建对象

只愿长相守 提交于 2019-11-27 16:10:59
目录 创建对象 工厂模式 构造函数模式 原型模式 动态原型模式 寄生构造函数模式 稳妥构造函数模式 补充 创建对象 js高程3--第6章面向对象的程序设计--第二节创建对象,批量创建对象有很多种模式,每一种模式都有自己的优点与缺点,搞清楚它们出现的历史原因,优缺点,我们才能使用的更加游刃有余! 本片文章并没有将细节的挖的特别深,重点关注的是每种模式的优缺点,怎么形成的。细节会另写博客总结。 正文开始 我们都知道创建 单个对象 有两种方法, 构造函数 和 字面量 的形式。 var obj = new Object(); //构造函数 var obj1 = {}; //字面量 如果我们想要创建 多个对象 , 这两种形式就有明显的缺点:每一个新对象都要手写生成,会产生大量重复的代码! 为了解决这个问题,聪明的程序员开始使用 工厂模式 。 工厂模式 用函数来封装以特定接口创建对象的细节 function createPerson(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function(){ alert(this.name); } return obj; } var zhangsan = creatPerson('zhangsan',18); 优点

原型(Prototype)设计模式

有些话、适合烂在心里 提交于 2019-11-27 10:52:57
原型(Prototype)设计模式 1.0.0:什么是原型?     用一个已经创建的对象,通过复制的手段创建一个和原对象相同或者相似的对象。 2.0.0:为什么要用原型? 对象创建的时间消耗要大于克隆(clone)的消耗?reason? 对象创建的时候是一个初始态,克隆是一个瞬时态。比如就是,你需要创建一个person,new 的话,person是一个初始态 A,你可能对person进行修改(update),修改之后person的状态发生了改变为 B。那么如果进行克隆的话,你的状态会停留在当前的状态。这就是clone和new的区别。在不同情况,可以分别处理。 clone会保留对象的状态信息,数据和原对象是一致的,如果对象中含有引用类型的数据的话,那么他的指向地址是一样的,那么比如说有对象A和他的克隆者B。A对他的引用类型进行修改,同时也会影响到B。 eg:A对象有一只鸡,他把鸡杀了,鸡处于死亡状态,那么他的克隆对象的鸡也会死亡。哈哈哈,在某些时候,我们不想他们一样,那么就是需要重新创建新的鸡的引用,存放在堆内存中的数据也就是不同的。如何做? num 对象的深复制 序列化方式--> 序列化 --> 反序列化 手动方式--> 所有的引用对象都实现cloneable --> 很麻烦,而且有一些基础类也没有实现cloneable num 引用的重新创建和指定,引用比较多的时候,会比较麻烦