设计模式笔记(6)---原型模式(创建型)

创建型设计模式:原型模式 本文介绍了使用原型模式解决克隆羊问题的实现方法。传统方式通过新建对象并逐一复制属性,效率较低且不够灵活。原型模式通过实现 Cloneable 接口并重写 clone () 方法,能够高效地创建对象副本。文章展示了原型模式的结构原理图,并用代码示例演示了如何克隆 Sheep 对象。此外,还分析了 Spring 框架中原型模式的应用场景,如 prototype 作用域的 Bean 创建。通过原型模式,可以动态获取对象运行时的状态,提高程序效率和扩展性。 阅读详情

 

Gof定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

动机

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。

假设在一些打斗游戏场景中,有这样一些角色,普通(NormalActor),可以飞的(FlyActor),可以潜水的(WaterActor)

public abstract class NormalActor { }
public abstract class FlyActor { }
public abstract class WaterActor { }

上面的三个类都是抽象类,自然会有具体的类来继承这些抽象类

public class NormalActorA : NormalActor { }
public class FlyActorA : FlyActor { }
public class WaterActorA : WaterActor { }

在游戏运行中就会去使用这些角色的具体类,如下

public class GameSystem
{
    public void Run()
    {
        NormalActorA normalActor1 = new NormalActorA();
        NormalActorA normalActor2 = new NormalActorA();
        NormalActorA normalActor3 = new NormalActorA();
        NormalActorA normalActor4 = new NormalActorA();
        NormalActorA normalActor5 = new NormalActorA();

        FlyActorA flyActor1 = new FlyActorA();
        FlyActorA flyActor2 = new FlyActorA();

        WaterActorA waterActor1 = new WaterActorA();
        WaterActorA waterActor2 = new WaterActorA();
    }
}
 

在GameSystem类中,我们直接使用具体类(NormalActorA)等来创建对象,GameSystem就对这些具体类产生了依赖,在DIP(依赖倒置原则)中讲到抽象不应依赖具体实现,具体实现应依赖于抽象,所以GameSystem中的代码要进行如下改动

public class GameSystem
{
    public void Run(NormalActor normalActor, FlyActor flyActor,
        WaterActor waterActor)
    {
        NormalActor normalActor1 = normalActor.Clone();
        NormalActor normalActor2 = normalActor.Clone();
        NormalActor normalActor3 = normalActor.Clone();
        NormalActor normalActor4 = normalActor.Clone();
        NormalActor normalActor5 = normalActor.Clone();

        FlyActor flyActor1 = flyActor.Clone();
        FlyActor flyActor2 = flyActor.Clone();

        WaterActor waterActor1 = waterActor.Clone();
        WaterActor waterActor2 = waterActor.Clone();
    }
}
 

经过修改在GameSystem类中已经看不到具体类的影子了,创建对象是通过传入的抽象类类型的参数的Clone方法来创建,关于Clone方法在后面讲到,这样GameSystem就只依赖于抽象了。

下面来说说Clone方法了,首先在抽象类中定义Clone方法

public abstract class NormalActor 
{
    public abstract NormalActor Clone();
}
public abstract class FlyActor 
{
    public abstract FlyActor Clone();
}
public abstract class WaterActor 
{
    public abstract WaterActor Clone();
}

然后在具体类中来实现Clone,使用MemberwiseClone方法来实现克隆,使用MemberwiseClone方法需要注意的是他只能实现值类型的拷贝,如果被拷贝对象中包含有引用类型,只会拷贝引用地址。

public class NormalActorA : NormalActor 
{
    public override NormalActor Clone()
    {
        return (NormalActor)this.MemberwiseClone();
    }
}
public class FlyActorA : FlyActor 
{
    public override FlyActor Clone()
    {
        return (FlyActor)this.MemberwiseClone();
    }
}
public class WaterActorA : WaterActor 
{
    public override WaterActor Clone()
    {
        return (WaterActor)this.MemberwiseClone();
    }
}

至此,原型模式的代码结构基本完成,下面看看在程序中试怎么来调用的

public class App
{
    public static void Main()
    {
        GameSystem gameSystem = new GameSystem();
        gameSystem.Run(new NormalActorA(), new FlyActorA(), new WaterActorA());
    }
}

 

原型模式(Prototype)的几个要点

Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。

Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象--所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。

Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。

TVS 管击穿电压与钳位电压的工程解析 TVS二极管的核心参数击穿电压(VBR)和钳位电压(VC)常被混淆,但二者具有本质区别。VBR是 阅读详情

相关推荐

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec请求头加密

本文详细解析了Shopee商品详情页反爬机制中x-sap-Ri和x-sap-Sec请求头参数的加密逻辑,通过JS逆向技术手把手教你定位加密入口、分析哈希算法与对称加密实现,并提供完整实战案例和应对反爬策略的高级技巧,助力开发者突破电商平台数据采集难点。

weixin_27875131的博客 1829

设计模式复习笔记 (6)创建型模式:原型模式

模式定义: 原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。 原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。模式动机: 在面向对象系统中,使用原

qq_33303925的博客 436

用Omniverse Kit开发第一个USD插件:从环境配置到实战案例(Python 3.7版)

本文详细介绍了如何使用NVIDIA Omniverse Kit和Python 3.7开发第一个USD插件,涵盖从环境配置到实战案例的全过程。通过创建可实时同步材质属性的USD插件,开发者可以快速掌握Omniverse开发框架,提升3D内容创作效率。

x8y9z0的博客 588

Java设计模式-创建型设计模式-原型模式

Java设计模式-创建型设计模式-原型模式

Fatter$hday的博客 1576

解密美团外卖API:mtgsig和waimai_sign参数生成原理与Python实现

本文深入解析了美团外卖API中核心风控参数mtgsig和waimai_sign的生成原理与实现方法。文章详细拆解了waimai_sign作为业务数据签名、mtgsig作为请求环境签名的不同角色与生成逻辑,并通过Python代码示例演示了如何通过逆向工程、Frida动态Hook等技术手段模拟签名生成过程,为开发者理解移动端API安全机制提供了实战参考。

weixin_29325515的博客 554

[PCIe5.0] 2.2.7.1 TPH Rules

TPH 机制通过硬件提示优化数据流,适用于高性能计算和存储场景。

系统固件工程师 350

【c++设计模式08】创建型6:原型模式(Prototype Pattern)

原型模式定义了一个原型接口,该接口用于复制现有对象以创建新对象,从而避免了昂贵的构建过程。使用原型模式,我们可以根据现有对象创建新对象,同时保持对象的类型和状态。浅拷贝:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。深拷贝:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的。

junxuezheng的博客 1582

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

java设计模式——创建型之原型模式

Prototype Pattern(原型模式)

Coding tortoise‘s JOY BOOKCASE~ 1690

[Dify实战] 在 Dify 官网环境使用 File Translator 插件实现 Office 文档翻译(支持 DOCX/XLSX/PPTX)

摘要:Dify平台的FileTranslator插件可实现Office文档一键翻译,保留原格式和结构。该插件支持Word、Excel、PPT等文件格式,无需额外密钥,直接复用Dify配置的大模型。安装后,用户可在Workflow中调用插件,设置目标语言等参数完成翻译。输出文件自动命名,保留原格式。适用于跨国协作、海外营销等场景,显著提升多语言办公效率。该插件简化了文档翻译流程,是企业用户和开发者的实用工具。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 544

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

JavaScript设计模式读书笔记(一)=> 创建型设计模式

简单工厂模式 为了尽量减少地创建全局变量,同一类对象在不同需求中的重复性使用。通过对简单工厂来创建一些对象,可以让这些对象共用一些资源而又私有一些资源。对于简单工厂模式来说,它的使用场合通常也就限制在创建单一对象。 // e.g. function createPop(type, text) { const o = {}; o.content = text; o.show = func...

翾的博客 894

Unity之Hololens2开发MRTK Profile详解

配置 MRTK 的主要方式之一是使用基础包中的配置文件。场景中的主要对象具有活动配置文件 - 一个 ScriptableObject。顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。此外,这些子配置文件也是 ScriptableObjects,因此可以包含对低它们一级的其他配置文件对象的引用。实质上,有一个包含已连接配置文件的完整树,这些配置文件构成了如何初始化 MRTK 子系统和功能的配置信息。

TxNet 1035

《深入设计模式》笔记 -创建型模式四、原型模式

原型模式 亦称: 克隆、Clone、Prototype 意图 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。 问题 如果你有一个对象, 并希望生成与其完全相同的一个复制品, 你该如何实现呢? 首先, 你必须新建一个属于相同类的对象。 然后, 你必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。 不错! 但有个小问题。 并非所有对象都能通过这种方式进行复制, 因为有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。 从外部” 复制对象并非总

weixin_39303983的博客 384

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Python笔记-设计模式】原型模式

设计模式,Python语言描述,原型模式

木子家有小可爱的博客 1570

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java设计模式笔记-创建型模式

创建型模式

white_while的博客 836

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式_创建型模式 -《原型模式》

原型模式 (Prototype Pattern) :用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 原型模式的克隆分为浅克隆和深克隆。 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象

How many ten years in the life time? 501

《设计模式详解》创建型模式 - 原型模式

原型模式4.3 原型模式4.3.1 概述4.3.2 结构4.3.3 实现4.3.4 案例4.3.5 使用场景4.3.6 扩展 - 深克隆引用对象的浅克隆实现:文件流 + 对象流实现:字节数组流 + 对象流测试 教程来源:黑马程序员Java设计模式详解,全网最全23种Java设计模式 教程来源:黑马程序员Java设计模式详解,全网最全23种Java设计模式 创建型模式的主要关注点是:怎样创建对象?,它的主要特点是:将对象的创建与使用分离。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。

萌宅鹿的技术小屋 3051

Python学习笔记(5)Python的创建型设计模式

单例模式可以用Python的模块来实现,没有特别的地方。由于Python可以动态的访问类对象,所以原型模式也什么意义(python提供了内置的copy方法)所以最有用的是抽象工厂模式工厂方法模式建造者模式。

立志成为炼丹师? 1203

《JavaScript设计模式》初次笔记——wsdchong

《JavaScript设计模式》初次笔记 前言 设计模式一直久仰大名,但是没有去花时间去了解,于是今天特意花时间去看《JavaScript设计模式》(2013年6月出版)和w3cschool上的设计模式。然后做了一些笔记。 以《JavaScript设计模式》为目录,以w3cschool上的设计模式为补充。 讲的内容有三:设计模式、JavaScript设计模式、其他(模块化的JavaScript设计模式、jQuery设计模式、jQuery插件设计模式)。 学习目的:尝试性地了解JavaScript设计模式,方

wsdchong的博客 1万+

【设计模式】(万字总结)深入理解Java中的创建型设计模式

在软件开发的世界里,设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计,更是对问题的思考和解决的方法论。在Java开发中,特别是在面向对象的编程中,设计模式尤为重要。创建型设计模式,作为设计模式的重要组成部分,专注于如何有效地创建对象,同时尽可能减少耦合度,提高代码的可复用性和可维护性。本文将带领您深入探索Java中的创建型设计模式。我们将从简单的概念入手,逐步深入到每种模式的具体实现方式和实际应用场景。通过学习和理解这些设计模式,您将能够更加灵活和高效地设计和开发Java应用程序。

stillfantasy77的博客 965

Java设计模式【一】 - 创建型设计模式

Java设计模式【一】 - 创建型设计模式

qq_33934427的博客 906

设计模式学习笔记——创建型设计模式

声明:本学习笔记阅读《掌握设计模式:23种经典模式实践、选择、价值与思想》记录,书的作者:Java全栈布道师。

weixin_44420750的博客 1485
上一篇: 设计模式笔记(5)---工厂方法模式(创建型)
下一篇: 设计模式笔记(7)---适配器模式(结构型)
oec2003
博客等级 码龄20年 373粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值