〇、简介

1、什么是原型模式?

一句话解释:

  针对比较耗时的对象创建过程,通过原型的 Clone 方法来克隆对象,而非重新创建。

原型设计模式(Prototype Design Pattern)是一种创建型设计模式,其主要目的是通过复制已有对象来创建新的对象,而无需通过实例化类并初始化其属性。这种模式在需要创建相似对象时非常有用,尤其是当创建过程较为复杂或耗时时。

原型设计模式中的 Clone() 方法可以是深拷贝或浅拷贝,具体取决于实现的方式。

官方意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

 一个比喻:(多个班级与礼堂)

  多个班级需要轮流在礼堂举行活动,门口有海报标注时间,相当于礼堂对象的引用。学校不会为每个班级修一座礼堂,这样太耗时,而是每个班级共用一个礼堂,使用时按照海报的时间即可。

2、优缺点和使用场景

优缺点:

  • 简化对象创建。原型设计模式通过克隆现有对象来创建新对象,避免了重新构造复杂的对象。这样可以简化对象的创建过程,减少了重复代码的编写
  • 提高性能。由于原型设计模式避免了重新执行初始化过程,通过复制现有对象来创建新对象,可以提高系统的性能,特别是在对象创建成本较高的情况下。
  • 隐藏对象创建细节。原型设计模式将对象的创建细节封装在原型对象中,客户端只需通过克隆操作即可创建新对象,无需了解对象创建的具体实现。这样可以降低系统的耦合度,提高代码的灵活性和可维护性
  • 动态添加或删除对象。原型设计模式通过克隆现有对象来创建新对象,可以方便地增加或减少对象的数量,实现了系统的灵活性和可扩展性。

原型设计模式在合适的场景下可以提供很多优点,但在使用时需要注意克隆方法的正确性和对象的深拷贝问题。

  • 需要对每个类进行克隆操作。在使用原型设计模式时,需要为每个类都实现克隆方法,这可能会增加代码量和维护成本。
  • 克隆方法的正确性。实现克隆方法时需要保证被克隆对象的所有成员变量都正确地进行复制,包括基本数据类型和引用类型。如果某个成员变量未正确克隆,可能会导致意外的行为或错误
  • 对象的深拷贝问题。在实现原型设计模式时,需要注意对象的深拷贝问题。如果对象中包含了其他对象的引用,需要确保对这些引用对象也进行递归的克隆操作,以实现真正的深拷贝

适用场景:

  • 创建一个对象的过程非常复杂或者耗时时,可以使用原型设计模式。通过复制现有对象来创建新对象,可以避免重新执行复杂的初始化过程,从而提高性能。
  • 当需要避免与对象创建相关的细节,并希望客户端能够独立于具体类进行实例化时,可以使用原型设计模式。通过原型模式,客户端可以通过复制原型对象来创建新对象,而无需了解对象创建的具体实现。
  • 当系统需要动态地添加或删除一些对象时,可以使用原型设计模式。通过克隆现有对象来创建新对象,可以方便地增加或减少对象的数量。
  • 当希望改变和定制一个对象的结构,同时又希望保持其行为不变时,可以使用原型设计模式。通过克隆对象并对其进行修改,可以快速生成新对象,同时保留原始对象的行为。

实际使用场景举例:

  • 在游戏开发中,角色的创建和管理是一个重要的问题。原型设计模式可以用于创建和管理大量的游戏角色。通过克隆原型角色对象,可以快速生成新的角色对象,减少了创建角色的开销。
  • 在数据库应用中,经常需要对数据库记录进行增删改查操作。使用原型设计模式,可以通过复制已有的数据库记录对象来创建新的记录对象,然后对新对象进行修改或插入操作,从而实现数据的快速操作和灵活性。
  • 在图形编辑器中,用户可以通过复制和粘贴操作来创建新的图形对象。这时可以使用原型设计模式,将已有的图形对象作为原型,在需要时通过克隆操作创建新的图形对象,避免了重新构造复杂的图形对象。
  • 在操作系统中,进程的创建和销毁是一个频繁且耗资源的操作。使用原型设计模式,可以通过克隆已有的进程对象来创建新的进程对象,提高了进程创建的效率
  • 原型设计模式可以与对象池模式结合使用,实现对象的缓存和复用。通过创建一组原型对象,并在需要时通过克隆操作获取对象,可以避免频繁地创建和销毁对象,提高系统的性能

一、原型模式的简单实现

下面例举个示例,父类实现 ICloneable 接口的 Clone() 方法:

// 父类:图形类
abstract class Shape : ICloneable // 实现接口 ICloneable 中的方法 Clone
{
protected string type;
public abstract void Draw();
public object Clone()
{
return this.MemberwiseClone(); // 创建当前对象的浅拷贝,两个引用指向同一个对象
// 注意:
// 浅拷贝就相当于给引用对象又起了另外一个名字,小黄和修勾勾都指的是这一只小狗;
// 深拷贝就是用克隆技术,把小黄复刻了一个长得一模一样的小黄二号,名字不同的同时指的对象也不同。
}
}
// 圆形类,继承图形类
class Circle : Shape
{
public Circle()
{
type = "Circle";
}
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}
// 矩形类,也继承图形类
class Rectangle : Shape
{
public Rectangle()
{
type = "Rectangle";
}
public override void Draw()
{
Console.WriteLine("Drawing a rectangle");
}
}
class Program
{
static void Main(string[] args)
{
Circle circle = new Circle(); // 创建一个圆形对象
Circle clonedCircle = (Circle)circle.Clone(); // 克隆圆形对象(复制了对象的引用)
// circle 和 clonedCircle 两个引用,指向同一个对象
clonedCircle.Draw(); Rectangle rectangle = new Rectangle(); // 创建一个矩形对象
Rectangle clonedRectangle = (Rectangle)rectangle.Clone(); // 克隆矩形对象
// rectangle 和 clonedRectangle 两个引用,指向同一个对象
clonedRectangle.Draw();
Console.ReadKey();
}
}

如下输出结果,调用克隆对象的 Draw() 得出:

  

二、结构

根据上一章节的示例代码,简单画一个 UML 图:

Shape:原型抽象,声明一个抽象类,实现 ICloneable 接口的 Clone() 方法,使得本抽象类可以被克隆。

Circle、Rectangle:原型,继承抽象类 Shape,实现自身可被克隆的性质。

Client:创建可被克隆的原型,并通过 Clone() 方法复制原型。

三、原型模式在 .Net 中的实际应用

例如在数据库连接管理的应用。

在数据库应用程序中,连接到数据库可能是一个耗时且资源密集的操作。为了避免每次都重新创建连接,可以使用原型设计模式来克隆现有的连接对象。

public class DbConnection : ICloneable
{
public string ConnectionString { get; set; }
// ... public object Clone()
{
return this.MemberwiseClone();
}
}
// 使用示例:
DbConnection originalConnection = new DbConnection { ConnectionString = "..." };
DbConnection clonedConnection = (DbConnection)originalConnection.Clone();

四、相关模式

Prorotype 和 AbstractFactory 模式在某些方面是互相竞争的。但是它们也可以一起使用,AbstractFactory 可以存储一个被克隆对象的原型集合,并且返回产品对象。

  • 原型设计模式的主要目的是通过克隆现有对象来创建新对象,以避免重复创建相似的对象。它适用于需要动态生成对象的情况,并且能够在运行时选择要克隆的对象。
  • 抽象工厂模式的主要目的是提供一个接口来创建一系列相关或依赖对象的家族,而无需指定具体的类。它适用于需要创建一组相关对象的情况,并且能够在运行时切换整个对象家族。

大量使用 Composite(组合) 和 Decorator(装饰) 模式的设计,通常也可以用到 Prototype 模式。

Prototype 原型模式简介与 C# 示例【创建型4】【设计模式来了_4】的更多相关文章

  1. OOAD-设计模式(三)之创建型设计模式(5种)

    前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...

  2. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

  3. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  4. Prototype 原型模式 复制 浅拷贝 clone MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 一天一个设计模式——Prototype 原型模式

    一.模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数. 那为什么不直接调用new方法来创建类的实例呢,主要一个原因是如果 ...

  6. 7、Prototype 原型模式 通过复制创造实例 创造型模式

    2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...

  7. 设计模式(1)--Prototype(原型模式)--创建型

    1.模式定义: 原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 2.使用场景: 在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的 ...

  8. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

  9. 设计模式:Prototype 原型模式 - 同学你抄过别人的作业么?-clone()方法的使用

    原型模式: 通过某个类的实例来创建对象 使用原型模式的好处: 好处是什么呢?当我们需要多次重复的创建一个类的示例的时候,我们可以使用new但是,new不仅仅耗费内存而且,如果new 某个类的构造方法中 ...

  10. C++设计模式-Prototype原型模式

    作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C+ ...

随机推荐

  1. 2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=

    2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间. 给定一个正数m,表示有m个人等位. 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n&l ...

  2. 又一个开源便斩获 7k star 的新模型「GitHub 热点速览」

    Star 并不能代表什么,但是绝对能表示一个项目的受欢迎程度.就像刚开源一周就有 7k+ star 的新模型,输入文本 / 图像就能获得 3D 对象.除了这个新模型,本周还有一款新的 Web 3D 渲 ...

  3. MultiBoot SPI

    对于7系列FPGA来说,计算器件启动时间按照以下公式: Config time = Bitstream size / (Config clk freq * Config interface width ...

  4. MVC 三层架构案例详细讲解

    MVC 三层架构案例详细讲解 @ 目录 MVC 三层架构案例详细讲解 每博一文案 1. MVC 概述 2. MVC设计思想 3. 三层架构 4. MVC 与 三层架构的关系: 5. 案例举例:用户账户 ...

  5. HTB靶场之Busqueda

    准备: 攻击机:虚拟机kali和win10(常规操作就直接用本机win10来操作了). 靶机:Inject,htb网站:https://www.hackthebox.com/,靶机地址:https:/ ...

  6. SpringMVC请求转发和重定向测试

    保存视图解析器的请求转发和重定向测试 1.web.xml模板文件(略) 2.springmvc配置文件 <?xml version="1.0" encoding=" ...

  7. GPUImage框架使用

    GPUImage框架简介 GPUImage框架是一个基于OpenGL ES 2.0的iOS图像和视频处理框架.它充分利用GPU并行计算能力可以实时处理图像和视频,可以让开发者轻松地实现各种滤镜效果. ...

  8. 第一课 使用开发者模式快速入门 Odoo 13

    Odoo提供了一个快速应用开发框架,非常适合创建商业应用.这类应用通常用于保留业务记录,增删改查操作.Odoo 不仅简化了这类应用的创建,还提供了看板.日历.图表等视图的丰富组件,用于创建好看的用户界 ...

  9. Java的运算符和表达式(基础语法学习)

    一.运算符 ​ 在Java中用于程序计算的操作符统称为运算符,运算符分为如下几类 1.算数运算符 运算符 说明 + 加号两边是数值,可以运算,如果一边存在字符串,则当作连接符 a+b - 两个数相加, ...

  10. Microsoft R 和 Open Source R,哪一个才最适合你?

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. R 是一个开源统计软件,在分析领域普及的非常快. 在过去几年中,无论业务规模如何,很多公司都采 ...