原型模式

文章目录

  • 原型模式
    • 模式分类
    • 模式产生的原因
    • 模式的灵感来源
    • 模式类图
    • 深克隆和浅克隆
      • 浅克隆
      • 深克隆
    • 经典代码实现
      • 原型模式通用实现:
      • 原型模式C#实现:
    • 原型模式总结
      • 原型模式的优点:
      • 原型模式的缺点:

本篇博客将介绍原型模式,原型模式是一种比较特殊的模式,它通过复制一个已经存在的对象来得到一个全新的对象,原则上我们改变新对象的内容源对象是不会受影响的。学习原型模式我们就需要明白程序中的两种克隆类型:深克隆和浅克隆。

模式分类

创建型设计模式。

模式产生的原因

当我们需要创建一大堆成本开销比较大的对象但是他们都是相似或者相同的时,我们可以考虑可不可以参考一个已经创建好的对象来创建出其余相同或者相似的对象。这样可以提高我们的创建效率。

模式的灵感来源

《西游记》中孙悟空可以拔毛变小猴,孙悟空可以根据自己的形象复制出很多和自己长得一模一样的身外身来。孙悟空这种根据自己的形象复制出身外身的技巧在软件设计中就是原型模式。

事实上在实际的生产中,尤其是零件的生产一般都是需要模型数据的,工人们不可能每个零件都自己去调整,一般都是通过一个模具来快速生产目标零件。

模式类图

经典原型模式包含以下3种角色:

Prototype(抽象原型类):

他是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至是具体实现类。

ConcretePrototype(具体原型类):

负责实现抽象克隆类中声明的克隆方法并返回克隆对象。

Client(客户类):

在客户端类中,我们会让一个原型对象自身克隆从而创建一个或者多个新对象。

深克隆和浅克隆

根据在复制对象的同时是否同时复制包含在原型对象中的引用类型的对象,克隆分为两种:深克隆和浅克隆。

浅克隆

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给新对象,如果是引用类型,在浅克隆中会复制一份引用类型的引用给新对象,也就是说新对象和原型对象的引用变量指向相同的内存地址。简单来说,浅克隆只会复制变量中直接存储的内容。

深克隆

深克隆中,如果原型对象的成员变量是值类型,将复制一份给新对象,如果是引用类型,深克隆会将引用变量指向内存区域中存储的实际数据复制一份给新对象,这时新对象的所有操作都不会对原型对象产生影响,真正意义上的全新的对象。

经典代码实现

原型模式通用实现:

Prototype:

namespace Prototype.Prototype.Example
{public interface IPrototype{IPrototype Clone();}
}

ConcretePrototype:

namespace Prototype.Prototype.Example
{public class ConcretePrototype : IPrototype{public int ParamA;public string ParamStr;public IPrototype Clone(){ ConcretePrototype prototype = new ConcretePrototype();prototype.ParamA = ParamA;prototype.ParamStr = ParamStr;return prototype;}}
}

原型模式C#实现:

原型模式使用C#实现时分为浅拷贝和深拷贝两种实现,其中C#官方已经帮我们实现了浅拷贝,深拷贝需要我们自己实现C#提供的ICloneable接口实现。

浅拷贝:

namespace Prototype.Prototype.ExampleCSharp
{public class Member{}public class ShallowCopyTest{public Member Member;public ShallowCopyTest Clone(){return (ShallowCopyTest) this.MemberwiseClone();}}
}

深拷贝:

namespace Prototype.Prototype.ExampleCSharp
{public class Member{}public class DeepCopyTest{public Member Member;public DeepCopyTest Clone(){DeepCopyTest deep = (DeepCopyTest) this.MemberwiseClone();deep.Member = new Member();return deep;}}
}

原型模式总结

原型模式的优点:

  1. 当我们要创建的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
  2. 拓展性好,由于原型模式提供了抽象原型类,可以针对抽象原型类进行编程。
  3. 原型模式的创建过程简单。
  4. 可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份将其状态保存起来,以便在需要时使用,例如撤销操作。

原型模式的缺点:

  1. 需要为每个类都配备一个克隆方法,而且克隆方法位于一个类的内部,违背了开闭原则。
  2. 在实现深克隆是往往要书写较为复杂的逻辑,对于复杂对象的克隆实现可能较为复杂。

C#设计模式之原型模式相关推荐

  1. 【GOF23设计模式】原型模式

    [GOF23设计模式]原型模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 1 pa ...

  2. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  3. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  4. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  5. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  6. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

  7. 设计模式之 原型模式

    原型模式应用场景举例:  GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...

  8. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. golang设计模式之原型模式

    原型模式 wiki:原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个 ...

  10. 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

    文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...

最新文章

  1. 每日一皮:为了找个程序员租客,我拼了!
  2. css中实现字符超出宽度自动换行和英语字符不断行的解决方法
  3. 【整理】内向交货(Inbound Delivery)
  4. python3中pip的安装、常见问题及万能解决方案。
  5. Java黑皮书课后题第9章:*9.10(代数:二次方程式)为二次方程式设计一个名为QuadraticEquation的类
  6. php mongodb 子查询,MongoDB数组子查询elemMatch
  7. C++的enum hack
  8. Mr.J-- HTTP学习笔记(十)-- Cookie机制
  9. vuejs之v-if-ajax异步请求数据遇到的坑
  10. 入我新美大的Java后台开发面试题总结
  11. 适配器模式之状态模式
  12. VirtualBox无法启动虚拟机的解决办法
  13. ABAP 如何解析 JSON 数据试读版
  14. Unity3D方向键控制人物移动的代码
  15. 搜索引擎的概念鄂州_搜索引擎的基本概念
  16. 常用基本初等函数的求导公式推导
  17. 编写一个完整的应用程序:从键盘上读入一句英文(只包含英文字母、空格、半角逗号和半角 句号,如:I will choose the presentation..先将该英文句子首字母大写再把句子逆序输出。
  18. 魔法门之英雄无敌3 android,魔法门之英雄无敌3 v0.86.04
  19. 态度决定高度,高度决定命运。对自己要狠一点,再狠一点,因为,你要的比别人多,就必须付出得比别人多。
  20. 改变屏幕显示方向,让屏幕显示旋转

热门文章

  1. GoogLeNet网络详解并使用pytorch搭建模型
  2. 【CSS3动画】从简单动画到实现平抛运动和弹跳效果-贝塞尔曲线的利用
  3. 细思极恐——R语言forestplot包画meta分析群体药动学常用森林图
  4. 为什么万物皆可NFT?为什么有的NFT是一个有的是多个呢?
  5. HVR数据复制软件部署之(二)--HUB端配置
  6. 异地多活数据同步平台
  7. uniapp dialog功能窗
  8. 求购 pcqq 安卓 协议 云控
  9. Linux 下查看麦克风或音频采集设备
  10. 软硬件配置大幅提升!解读戴尔新一代PowerEgde14服务器