【23种设计模式】原型模式(五)

这篇具有很好参考价值的文章主要介绍了【23种设计模式】原型模式(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度。如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适。由于每个类实例都是相同的,这个相同指的是类型相同,但是每个实例的状态参数会有不同,如果状态数值也相同就没意义了,有一个这样的对象就可以了。当我们需要多个相同的类实例时,可以通过对原来对象拷贝一份来完成创建,这个思路正是原型模式的实现方式。

原型模式的定义

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

原型模式的组成

【23种设计模式】原型模式(五)

  • 原型类(Prototype):原型类,声明一个Clone自身的接口;

  • 具体原型类(ConcretePrototype):实现一个Clone自身的操作。

在原型模式中,Prototype通常提供一个包含Clone方法的接口,具体的原型ConcretePrototype使用Clone方法完成对象的创建。

原型模式的实现

《大话西游之大圣娶亲》这部电影,没看过的人不多吧,里面有这样一个场景。牛魔王使用无敌牛虱大战至尊宝,至尊宝的应对之策就是,从脑后把下一撮猴毛,吹了口仙气,无数猴子猴孙现身,来大战牛魔王的无敌牛虱。至尊宝的猴子猴孙就是该原型模式的最好体现。至尊宝创建自己的一个副本,不用还要重新孕育五百年,然后出世,再学艺,最后来和老牛大战,估计黄花菜都凉了。他有3根救命猴毛,轻轻一吹,想要多少个自己就有多少个,方便,快捷。

抽象原型
 /// <summary>
    /// 抽象原型,定义了原型本身所具有特征和动作,该类型就是至尊宝
    /// </summary>
    public abstract class Prototype
    {
        /// <summary>
        /// 战斗--保护师傅
        /// </summary>
        public abstract void Fight();
        /// <summary>
        /// 化缘--不要饿着师傅
        /// </summary>
        public abstract void BegAlms();

        /// <summary>
        /// 吹口仙气--变化一个自己出来
        /// </summary>
        /// <returns></returns>
        public abstract Prototype Clone();
    }
具体原型

创建两个具体原型:行者孙和孙行者

行者孙:

 /// <summary>
    /// 具体原型,例如:行者孙,他只负责化斋饭食和与天界宠物下界的妖怪的战斗
    /// </summary>
    public sealed class XingZheSunPrototype : Prototype
    {
        /// <summary>
        /// 战斗--保护师傅--与自然修炼成妖的战斗
        /// </summary>
        public override void Fight()
        {
            Console.WriteLine("行者孙:腾云驾雾,与天界宠物下界的妖怪的战斗....");
        }
        /// <summary>
        /// 化缘--不要饿着师傅--饭食类
        /// </summary>
        public override void BegAlms()
        {
            Console.WriteLine("行者孙:化缘鸡鱼肉蛋....");
        }

        /// <summary>
        /// 吹口仙气--变化一个自己出来
        /// </summary>
        /// <returns></returns>
        public override Prototype Clone()
        {
            return (XingZheSunPrototype)this.MemberwiseClone();
        }
    }

孙行者:

  /// <summary>
    /// 具体原型,例如:孙行者,他只负责与自然界修炼成妖的战斗和化斋水果
    /// </summary>
    public sealed class SunXingZhePrototype : Prototype
    {
        /// <summary>
        /// 战斗--保护师傅-与天界宠物战斗
        /// </summary>
        public override void Fight()
        {
            Console.WriteLine("孙行者:腾云驾雾,与自然界修炼成妖的战斗....");
        }
        /// <summary>
        /// 化缘--不要饿着师傅---水果类
        /// </summary>
        public override void BegAlms()
        {
            Console.WriteLine("孙行者:化缘水果....");
        }

        /// <summary>
        /// 吹口仙气--变化一个自己出来
        /// </summary>
        /// <returns></returns>
        public override Prototype Clone()
        {
            return (SunXingZhePrototype)this.MemberwiseClone();
        }
    }
调用
public void RunTest()
        {
            //原型行者孙
            Prototype xingZheSun = new XingZheSunPrototype();
            Prototype xingZheSun2 = xingZheSun.Clone();
            Prototype xingZheSun3 = xingZheSun.Clone();
            //1号行者孙打妖怪
            xingZheSun.Fight();
            //2号行者孙去化缘
            xingZheSun3.BegAlms();
            Console.WriteLine("\r\n*****************************\r\n");
            //原型孙行者
            Prototype sunXingZhe = new SunXingZhePrototype();
            Prototype sunXingZhe2 = sunXingZhe.Clone();
            Prototype sunXingZhe3 = sunXingZhe.Clone();
            Prototype sunXingZhe4 = sunXingZhe.Clone();
            Prototype sunXingZhe5 = sunXingZhe.Clone();

            //1号孙行者打妖怪
            sunXingZhe.Fight();
            //2号孙行者去化缘
            sunXingZhe2.BegAlms();

            //战斗和化缘也可以分类,比如化缘,可以分:水果类化缘,饭食类化缘;战斗可以分为:天界宠物下界成妖的战斗,自然修炼成妖的战斗,大家可以自己去想吧,原型模式还是很有用的

        }

【23种设计模式】原型模式(五)

原型模式的优缺点

优点
  • 原型模式向客户隐藏了创建新实例的复杂性。

  • 原型模式允许动态增加或较少产品类。

  • 原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。

  • 产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构。

缺点
  • 每个类必须配备一个克隆方法。

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。文章来源地址https://www.toymoban.com/news/detail-683954.html

到了这里,关于【23种设计模式】原型模式(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件设计模式系列之七——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和

    2024年02月08日
    浏览(46)
  • 设计模式之开闭原则:如何优雅地扩展软件系统

    在现代软件开发中,设计模式是解决常见问题的最佳实践。其中,开闭原则作为面向对象设计的六大基本原则之一,为软件系统的可维护性和扩展性提供了强大的支持。本文将深入探讨开闭原则的核心理念,以及如何在实际项目中运用这一原则,以便更好地设计软件系统。

    2024年01月18日
    浏览(39)
  • 软考高级系统架构设计师系列论文八十三:论软件设计模式的应用

    软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构

    2024年02月11日
    浏览(63)
  • Java设计模式-前言

     馆长准备了很多学习资料,其中包含 java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具  等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关

    2024年01月21日
    浏览(41)
  • 一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处        设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应用,不同的模式有各自的优缺点,开发者可以基于自身需求

    2024年02月09日
    浏览(53)
  • 二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道

    在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性和可维护性。本文将详细介绍原型管理器的用

    2024年02月07日
    浏览(56)
  • JAVA设计模式----原型设计模式

    定义 :用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型 :创建类模式 类图 : 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只

    2024年02月13日
    浏览(49)
  • 重温设计模式 --- 原型模式

    原型模式 是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们

    2024年02月13日
    浏览(49)
  • 设计模式系列-原型模式

    一、上篇回顾 上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的,但是每个对象的组装的过程来说可能是相对固定的或者说是

    2024年02月09日
    浏览(43)
  • 设计模式-原型模式

    目录 一、传统方式 二、原型模式  三、浅拷贝和深拷贝 克隆羊问题: 现在有一只羊tom,姓名为: tom,年龄为: 1,颜色为: 白色,请编写程序创建和tom羊属性完全相同的10只羊。 传统的方式的优缺点: 简单易操作。优点是比较好理解。 在创建新的对象时,总是需要重新获取原

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包