设计模式学习笔记(六)——Prototype原型模式

设计模式(四)原型模式Prototype(创建型) 设计模式(四)原型模式Prototype 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。 例..................... 阅读详情
设计模式学习笔记(六)——Prototype原型模式

       Prototype原型模式是一种创建型设计模式,它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。感觉好像和前几篇所说的设计模式有点分不清,下面我们先来回顾一下以前的几种设计模式,予以区分,再来说说原型模式。

       Singleton单件模式解决的问题是:实体对象个数问题(这个现在还不太容易混)

       AbstractFactory抽象工厂模式解决的问题是:“一系列互相依赖的对象”的创建工作

       Builder生成器模式解决的问题是:“一些复杂对象”的创建工作,子对象变化较频繁,对算法相对稳定

      FactoryMethor工厂方法模式解决的问题是:某个对象的创建工作

      再回来看看今天的Prototype原型模式,它是用来解决“某些结构复杂的对象”的创建工作。现在看看,好象还是差不多。这个问题先放在这,我们先往下看Prototype原型模式。

      《设计模式》中说道:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

      此时注意:原型模式是通过拷贝自身来创建新的对象,这一点和其他创建型模式不相同。好,我们再来看看原型模式的结构


      
这个结构说明原型模式的客户端程序(ClientApp)是依赖于抽象(Prototype),而对象的具体实现也是依赖于抽象(Prototype)。符合设计模式原则中的依赖倒置原则——抽象不应依赖于具体实现,具体实现应依赖于抽象。

       我们现在回来看看原型模式的实现,我定义了一个场景,一个人开这一辆车在一条公路上。现在这件事是确定的,但不确定的有几点:1、人:姓名,性别,年龄;2车:什么牌子的;3公路:公路名字,长度,类型(柏油还是土路)。现在我们一个个实现。

       先来实现人,定义一个抽象类,AbstractDriver,具体实现男性(Man)和女性(Women)

public abstract class AbstractDriver

    {

        public AbstractDriver()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string name;

        public string sex;

        public int age;

 

        public abstract string drive();

 

        public abstract AbstractDriver Clone();

    }

 

    public class Man:AbstractDriver

    {

        public Man(string strName,int intAge)

        {

            sex = "Male";

            name = strName;

            age = intAge;

        }

 

        public override string drive()

        {

            return name + " is drive";

        }

 

        public override AbstractDriver Clone()

        {

            return (AbstractDriver)this.MemberwiseClone();

        }

    }

 

    public class Women:AbstractDriver

    {

        public Women(string strName,int intAge)

        {

            sex = "Female";

            name = strName;

            age = intAge;

        }

 

        public override string drive()

        {

            return name + " is drive";

        }

 

        public override AbstractDriver Clone()

        {

            return (AbstractDriver)this.MemberwiseClone();

        }

    }

    注意:抽象代码中有一个Clone的方法,个人认为这个方法是原型模式的一个基础,因为前面讲了原型模式是通过拷贝自身来创建新的对象。

      下面我们再来实现公路和汽车

      公路:

public abstract class AbstractRoad

    {

        public AbstractRoad()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string Type;

        public string RoadName;

        public int RoadLong;

 

        public abstract AbstractRoad Clone();

    }

 

    public class Bituminous:AbstractRoad    //柏油路

    {

        public Bituminous(string strName,int intLong)

        {

            RoadName = strName;

            RoadLong = intLong;

            Type = "Bituminous";

        }

 

        public override AbstractRoad Clone()

        {

            return (AbstractRoad)this.MemberwiseClone();

        }

    }

 

    public class Cement:AbstractRoad        //水泥路

    {

        public Cement(string strName,int intLong)

        {

            RoadName = strName;

            RoadLong = intLong;

            Type = "Cement";

        }

 

        public override AbstractRoad Clone()

        {

            return (AbstractRoad)this.MemberwiseClone();

        }

    }

   

    汽车:

    public abstract class AbstractCar

    {

        public AbstractCar()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string OilBox;

        public string Wheel;

        public string Body;

 

        public abstract string Run();

        public abstract string Stop();

 

        public abstract AbstractCar Clone();

    }

 

    public class BMWCar:AbstractCar

    {

        public BMWCar()

        {

            OilBox = "BMW's OilBox";

            Wheel = "BMW's Wheel";

            Body = "BMW's body";

        }

 

        public override string Run()

        {

            return "BMW is running";

        }

 

        public override string Stop()

        {

            return "BMW is stoped";

        }

 

        public override AbstractCar Clone()

        {

            return (AbstractCar)this.MemberwiseClone();

        }

    }

 

    public class BORACar:AbstractCar

    {

        public BORACar()

        {

            OilBox = "BORA's OilBox";

            Wheel = "BORA's Wheel";

            Body = "BORA's Body";

        }

 

        public override string Run()

        {

            return "BORA is running";

        }

 

        public override string Stop()

        {

            return "BORA is stoped";

        }

 

        public override AbstractCar Clone()

        {

            return (AbstractCar)this.MemberwiseClone();

        }

    }

 

    public class VolvoCar:AbstractCar

    {

        public VolvoCar()

        {

            OilBox = "Volvo's OilBox";

            Wheel = "Volvo's Wheel";

            Body = "Volvo's Body";

        }

 

        public override string Run()

        {

            return "Volvo is running";

        }

 

        public override string Stop()

        {

            return "Volvo is stoped";

        }

 

        public override AbstractCar Clone()

        {

            return (AbstractCar)this.MemberwiseClone();

        }

    }

    然后我们再来看看场景,我们定义一个Manage类,在这个场景中有一个人,一辆车和一条公路,代码实现如下:

class Manage

    {

        public AbstractCar Car;

        public AbstractDriver Driver;

        public AbstractRoad Road ;

 

        public void Run(AbstractCar car,AbstractDriver driver,AbstractRoad road)

        {

            Car = car.Clone();

            Driver = driver.Clone();

            Road = road.Clone();

        }

    }

    可以看到,在这个代码中,场景只是依赖于那几个抽象的类来实现的。最后我们再来实现一下客户代码,比如我现在要一辆Volvo车,一个叫“Anli”的女司机,在一条叫“Road 1 ” 、长1000的柏油路上。

        static void Main (string[] args)

        {

            Manage game = new Manage();

            game.Run(new VolvoCar(),new Women("Anli",18),new Bituminous("Road1",1000));

            Console.Write("CarRun:" + game.Car.Run() + "/n");

            Console.Write("DriverName:" + game.Driver.name + "/n");

            Console.Write("DriverSex:" + game.Driver.sex + "/n");

            Console.Write("RoadName:" + game.Road.RoadName + "/n");

            Console.Write("RoadType:" + game.Road.Type + "/n");

            Console.Write("CarStop:" + game.Car.Stop() + "/n");

            Console.Read();

        }

    运行的结果是:

    CarRun:Volvo is running

DriverName:Anli

DriverSex:Female

RoadName:Road1

RoadType:Bituminous

CarStop:Volvo is stoped

 

如果我现在想换成BORA车,让我(kid-li)开,在一个水泥马路上,我们只要更改Main函数中Run的实参。

game.Run(new BORACar(),new Man("kid-li",24),new Cement("Road1",1000));

运行结果是:

CarRun:BORA is running

DriverName:kid-li

DriverSex:Male

RoadName:Road1

RoadType:Cement

CarStop:BORA is stoped

这样,经过简单的更改,可以实现实现细节的变化。

现在我们再来看看原型模式的几个要点:

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

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

3、Prototype模式中的Clone方法可以利用Object类的MemberwiseClone()或者序列化来实现深拷贝。

这里面我们再来说说浅拷贝和深拷贝。我想对于Prototype模式是很重要的。我觉得浅拷贝和深拷贝的关键区别是对于引用对象的拷贝。例如我们有一个类Class1,

public class Class1

{

    int a;

    int[] b;

}

我们用浅拷贝实现了两个对象c1和c2,对于c1.a和c2.a,他们所有的内存空间是不一样的,但是c1.b和c2.b,由于它们是引用类型,在浅拷贝时只是拷贝了一个地址给b成员,实际上c1.b和c2.b指向同一块内存。

但如果我们用深拷贝,c1.b和c2.b指向的是不同的内存地址。那又如何实现深拷贝呢?我们可以利用序列化和反序列化来实现。

对于浅拷贝和深考贝的问题,我的同事TerryLee曾写过一篇文章《小议.NET中的对象拷贝》,我在这就不赘述了。

 
C++设计模式——Prototype Pattern原型模式 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化操作产生的性能开销,使得创建对象的操作更加便捷,它减少了大量不必要的重复工作,并提高了系统性能。当创建对象的操作比较复杂和耗时的时候,原型模式则提供了一个更加高效和简单的创建对象的模式,它可以更加快速的创建对象的副本,且不需要依赖对象的某些实例化步骤,它避免了使用传统的new关键字创建对象实例时的复杂构造过程。 阅读详情

相关推荐

鸿蒙日历组件进阶:教你打造个性化日程管理界面(支持月份切换)

本文深入探讨了鸿蒙应用开发中自定义日历组件的构建方法。通过详解基于Grid的布局设计、核心日期算法、月份切换逻辑以及事件管理集成,指导开发者打造支持个性化日程管理的高性能日历界面,提升应用交互体验。

weixin_29207149的博客 66

原型模式

一.概要1.场景--思考一下:克隆技术是怎么样的过程?克隆羊多利大家还记得吗?--javascript语言中的,继承是怎么实现的?那里面也有prototype,大家还记得吗?2.原型模式--通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模型。--就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点--优势有:效率高( 直接克隆,避免了...

C/C++ 252

DDR5内存命令真值表详解:如何正确解析JESD79-5标准中的关键指令

本文深度解析JESD79-5标准中的DDR5内存命令真值表,将其视为动态通信协议进行拆解。详细阐述了1-Cycle与2-Cycle命令的区别、Bank Group寻址机制以及模式寄存器(MR)操作流程,为硬件与固件工程师提供了从信号解析到系统调试的完整实战指南,是理解和优化高性能计算平台内存子系统的核心。

numpy6sculptor的博客 548

.Net设计模式学习笔记(六):原型模式(Prototype Pattern)

概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构。这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适。那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 结构图 Prototype模式结构图 生活中的例子...

weixin_34050519的博客 81

告别手动解析!用这个Qt库轻松处理Cat 21/62等18种Asterix航空数据

本文介绍了基于Qt框架的高效Asterix报文解析库,帮助开发者轻松处理Cat 21/62等18种航空数据。该库通过协议抽象化、多维度API设计和跨平台支持,解决了手动解析的复杂性和易错问题,显著提升开发效率和系统可靠性。

weixin_42529366的博客 207

VS2019手动添加bits/stdc++.h全指南(附解决‘无法打开源文件‘错误)

本文详细介绍了在Visual Studio 2019中手动配置C++万能头文件bits/stdc++.h的完整方法,解决常见的'无法打开源文件'错误。通过分析GCC与MSVC编译器生态差异,提供了纯手动创建和MinGW移植两种可靠方案,并给出详细的步骤、常见错误排查及最佳实践建议,帮助开发者高效配置竞赛开发环境。

weixin_29011395的博客 547

设计模式学习笔记六(Prototype原型模式)

抽象不应该依赖于实现细节,实现细节应该依赖于抽象。动机:在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但它们却拥有比较稳定一致的接口。如何向“客户程序(使用这些对象的程序)”隔离出“这些易变的对象”,从而使得“使用这些易变对象的客户程序”不随着需求的改变而改变。意图:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

Erictianya的专栏 626

论文深度解析:基于大语言模型的城市公园多维度感知解码与公平性提升

本文针对城市公园感知测量的精细化不足与公平性评估缺口,提出了一套融合社交媒体数据与大语言模型(LLM)的创新分析框架。通过领域适配微调开发的Park-Perception-LLM模型,实现了对感知可达性、可用性、吸引力三大核心维度83%-91%的高精度分类。将该感知指标创新性地融入增强两步浮动集水区法(E2SFCA),以香港高密度城市为案例,系统揭示了公园质量与数量的空间不平等及错配模式。借助多元回归模型,深入挖掘了公园内部特征、宏观建成环境、微观街道景观及时间因素对感知的影响机制。

May the Force be with you 1014

设计模式学习笔记——Prototype原型模式

原型模型就是克隆。 还有深克隆、浅克隆,一切听上去都那么耳熟能详。

左直拳的马桶_日用桶 1006

向华为学习——解读华为战略规划SP与业务计划BP流程【附全文阅读】

该方案针对大中型企业高管及战略团队,系统拆解华为SP(4-9月中长期规划)与BP(10-12月年度执行)双轨体系,形成"战略制定-业务设计-资源配置-绩效解码"闭环。SP侧重市场趋势分析、业务优先级与资源分配,BP细化KPI、预算及行动计划。通过价值树、战略解码等工具实现战略到部门/个人的目标分解,强化跨部门协同与过程管控。配套17份华为实战资料(包括战略管理、流程优化、销售组织建设等核心方法论),助力企业建立规范的战略执行体系,实现资源优化与绩效落地。

cdfunlove的博客 768

Android 13.0 开机启动优化之PMS扫描apk耗时相关功能优化

在android13.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装app,来加快开机时间,接下来 来实现这个功能

安卓兼职framework和app工程师的博客 1333

设计模式-原型模式 Prototype Pattern

通常,如果需要快速复制对象并且对象的创建成本较高,或者需要创建多个相似但不完全相同的对象,原型模式是一个更好的选择。原型模式(Prototype Pattern)是一种创建型设计模式,它允许你通过复制现有的对象来创建新的实例,而不是通过新建的方式来构造。使用原型模式可以提高对象创建的效率,降低系统的资源消耗,并有助于实现对象的快速复制和灵活管理。然而,需要注意的是,原型模式可能会增加内存消耗,并且在处理包含引用类型成员的对象时需要特别小心,以避免浅拷贝导致的问题。

wesigj的博客 1699

高性能C#上位机:多串口并发,百万数据不卡顿

去年做了一个环境监测项目,要对接32个串口传感器,每个传感器每秒发10条数据,一天下来就是2700多万条数据,之前的老程序跑起来UI直接卡死,数据丢包率高达10%,存到数据库要卡半天,客户要求数据丢包率为0,UI响应延迟≤100ms,百万级数据查询≤1s。这套多串口通信方案已经用在了我们公司10多个项目上,最多支持64个串口同时并发,每秒处理3000条数据,完全不卡顿,数据零丢包,客户非常满意,最近做的一个光伏监测项目,对接了48个串口传感器,稳定运行了6个月,没有出过任何问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 425

设计模式 - Prototype 原型模式

我看行

敖丙 4540

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设计模式:原型模式(Prototype)

设计模式:原型模式(Prototype)

ProgramNovice的博客 1166

android 蓝牙通讯demo

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

设计模式第8讲——原型模式(Prototype)

原型模式属于创建型设计模式。 一、什么是原型模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图5.1 HeroSkill(英雄--具体原型类)5.2 StealManFactory(塞拉斯--客户端)5.3 TestPrototype六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 4941

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

23种设计模式之原型模式(Prototype Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

Java设计模式 六 原型模式 (Prototype Pattern)

原型模式是解决对象重复创建问题的强大工具,特别适合那些创建成本高或需要快速生成对象的场景。根据具体需求,可以选择浅拷贝或深拷贝的实现方式。尽管实现上可能会稍复杂,但它提供了灵活性和高效性,是值得掌握的重要设计模式之一。

空 1117

设计模式|原型模式(Prototype Pattern)

原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而无需显式地指定它们的类。这种模式通常用于当对象的创建成本较高,或者对象初始化过程比较复杂时。

weixin_44435110的博客 1420

设计模式六:原型模式(Prototype Pattern)

原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。原型模式的主要思想是基于对象的复制。通过使用原型模式,我们可以避免直接实例化对象,从而提高性能和代码灵活性。此外,原型模式还可以用于创建复杂的对象结构,因为它允许我们在创建对象时使用已经存在的对象作为蓝图。

qq_40537587的博客 834

设计模式-原型模式(Prototype)

原型是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。

紫荆鱼的博客 1057

【C#设计模式】5.原型模式(Prototype)【创建型】

1.1 动机(Motivate) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变? 1.2 意图(Intent) 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 --《设计模式》Gof ..................

星Yeah 的博客 3228
上一篇: 设计模式学习笔记(五)——FactoryMethod工厂模式
下一篇: 设计模式学习笔记(七)——Adapter适配器模式
zhy05
博客等级 码龄21年 21粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值