首页 > 其他分享 >原型模式

原型模式

时间:2024-02-28 09:56:16浏览次数:26  
标签:克隆 角色 对象 创建 模式 原型

简介

原型模式(Prototype Pattern)是一种创建型设计模式,它允许创建新对象的同时,通过复制现有对象的方式来初始化新对象。这意味着在原型模式中,新对象的创建过程不再依赖于直接实例化类,而是通过复制已有对象的方式来进行。

在原型模式中,存在一个原型对象(Prototype),它是需要被复制的对象。通常情况下,原型对象实现一个克隆方法(Clone),用于复制自身。客户端通过调用克隆方法来创建新对象,而不是通过直接实例化类。这样做的好处是可以在运行时动态地获得新对象,而不需要在编译时知道对象的具体类型。

案例

假设你是一个游戏开发者,正在制作一个角色扮演游戏。在游戏中,玩家可以控制不同的角色进行冒险。每个角色都有自己的外观、技能和属性。现在,你需要设计一个系统,使得可以快速创建新的角色,而不必从头开始设计每个新角色的属性。这个场景可以很好地使用原型模式来完成。

在这个场景中:

  1. 原型对象(Prototype):角色是原型对象,每个角色都可以作为其他角色的原型。每个角色对象可以被复制以创建新的角色对象。

  2. 克隆方法(Clone):角色对象实现一个克隆方法,该方法用于复制自身。通过调用克隆方法,可以创建新的角色对象。

  3. 客户端(Client):你作为游戏开发者就是客户端,在需要设计新的角色时,你可以选择一个已有的角色作为原型,然后通过克隆方法来创建新的角色对象。

举例来说,你已经设计了一个名为“勇士”的角色,他是一个拥有高生命值和强力近战技能的角色,外观上有着骑士的盔甲和长剑。现在,你想要创建一个新的角色,名为“法师”,他是一个拥有强大的魔法技能的角色,外观上穿着长袍、手持法杖。

使用原型模式,你只需选择“勇士”角色作为原型,然后调用克隆方法来创建新的角色对象。新角色对象将复制“勇士”角色的属性,包括生命值、技能和外观,并且可以根据需要修改其中的某些属性,例如修改技能为魔法技能、修改外观为穿着长袍,从而得到一个全新的角色“法师”。

通过原型模式,你可以快速创建新的角色,而不必重新设计每个新角色的属性,这样可以节省时间和精力,提高游戏开发效率。

// 角色类 - 原型对象
class Character
{
    public string Name { get; set; }
    public int Health { get; set; }
    public string Skill { get; set; }
    public string Appearance { get; set; }
    public int Level { get; set; }
    public int Experience { get; set; }

    public Character Clone()
    {
        return (Character)this.MemberwiseClone();
    }

    public override string ToString()
    {
        return $"Name: {Name}, Health: {Health}, Skill: {Skill}, Appearance: {Appearance}";
    }
}

// 客户端
class Client
{
    static void Main(string[] args)
    {
        // 创建原型角色
        Character warrior = new Character
        {
            Name = "Warrior",
            Health = 100,
            Skill = "Melee",
            Appearance = "Knight armor and longsword",
            Level = 1,
            Experience = 0,
        };

        // 使用原型模式创建新角色
        Character mage = warrior.Clone();
        mage.Name = "Mage";
        mage.Skill = "Magic";
        mage.Appearance = "Robe and staff";

        // 输出新角色信息
        Console.WriteLine("New Character - Mage:");
        Console.WriteLine(mage);
    }
}

 

优点:

  1. 简化对象的创建过程:原型模式通过复制现有对象来创建新对象,而无需重新设计每个新对象的属性。这样可以大大简化新对象的创建过程,提高了代码的可读性和可维护性。

  2. 提高性能:相对于直接创建对象,使用原型模式可以提高性能。因为对象的创建过程通常比较耗时,而通过复制现有对象来创建新对象,可以节省创建对象的时间和资源。

  3. 隐藏对象创建细节:原型模式封装了对象的创建过程,客户端无需了解对象的具体创建实现细节,只需调用原型对象的克隆方法即可创建新对象。这样可以隐藏对象创建的细节,提高了代码的封装性和安全性。

  4. 灵活性:原型模式允许动态地获得新对象,而不需要在编译时知道对象的具体类型。这使得系统更加灵活,可以根据需要创建不同类型的对象。

  5. 支持动态添加或移除属性:由于原型模式是通过复制现有对象来创建新对象,因此支持动态添加或移除属性。这样可以灵活地修改对象的属性,满足不同场景的需求。

缺点:

  1. 深拷贝问题:原型模式通常实现浅拷贝,即只复制对象本身而不复制对象内部引用的其他对象。如果原型对象内部包含了其他对象的引用,并且需要进行深拷贝,那么深拷贝的实现可能较为复杂。

  2. 需要实现克隆方法:要使用原型模式,需要在原型对象中实现克隆方法,这使得原型对象的设计和实现变得复杂。如果对象的结构比较复杂或者包含私有属性,实现克隆方法可能会比较困难。

  3. 浅拷贝引用问题:在原型模式中,克隆对象与原型对象共享相同的引用,即修改克隆对象的属性可能会影响原型对象,这可能导致意外的结果。因此,需要特别注意对象之间的引用关系,以避免出现问题。

适用场景

  1. 对象的创建成本较高:当对象的创建过程比较复杂或者耗时较长时,可以使用原型模式来避免重复的对象创建过程,提高系统的性能和效率。通过复制现有对象来创建新对象,可以节省创建对象的时间和资源。

  2. 需要动态地获得新对象:当需要根据不同情况动态地获得新对象时,可以使用原型模式。原型模式允许动态地复制现有对象来创建新对象,而无需在编译时知道对象的具体类型。这样可以提高系统的灵活性,满足不同场景的需求。

  3. 对象的结构比较复杂:当对象的结构比较复杂或者包含了其他对象的引用时,可以使用原型模式来创建新对象。通过复制现有对象来创建新对象,可以避免重新构造对象的复杂结构,减少了对象的初始化时间和资源消耗。

  4. 需要隐藏对象创建细节:当需要隐藏对象创建的细节时,可以使用原型模式。原型模式封装了对象的创建过程,客户端无需了解对象的具体创建实现细节,只需调用原型对象的克隆方法即可创建新对象。这样可以提高代码的封装性和安全性。

标签:克隆,角色,对象,创建,模式,原型
From: https://www.cnblogs.com/mchao/p/18039063

相关文章

  • 建造者模式
    简介建造者模式(BuilderPattern)是一种创建型设计模式,用于构建复杂对象。它的主要目的是将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示形式。这种模式通常适用于创建对象的参数较多,且某些参数之间存在复杂的依赖关系的情况。在建造者模式中,通常会有一个建造......
  • C++特殊类的设计与单例模式
    //1.设计一个不能被拷贝的类/*解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。C++98;将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即......
  • 详解在 centos 中引导到救援模式
    详解在centos中引导到救援模式Linux系统CentOS进入单用户模式和救援模式详解一、概述目前在运维日常工作中,经常会遇到服务器异常断电、忘记root密码、系统引导文件损坏无法进入系统等等操作系统层面的问题,给运维带来诸多不便,现将上述现象的解决方法和大家分享一下,本次主要以C......
  • Ubuntu如何进救援模式
    linux的救援模式-1详解在Ubuntu中引导到救援模式或紧急模式这篇教程将介绍如何在Ubuntu22.04、20.04和18.04LTS版本中引导到救援Rescue模式或紧急Emergency模式。你可能已经知道,在RHEL7、RHEL8、Ubuntu16.04LTS及其更新的版本的Linux发行版中运行等级R......
  • 设计模式--观察者(Observer)模式
    目录概念概念观察者模式(ObserverPattern)是C++中常用的一种设计模式,它定义了对象间的一种一对多的依赖关系。在这种模式中,当一个对象(被观察者,Subject)的状态发生改变时,所有依赖于它的对象(观察者,Observer)都会收到通知并自动更新。这种模式的结构通常包括四个部分:抽象主题(Subject......
  • 接口隔离原则(设计模式)
    定义“Clientsshouldnotbeforcedtodependuponinterfacesthattheydonotuse”个人认为接口隔离原则,和单一原则有点像。一个接口实现一个功能。 不过,你应该已经发现,接口隔离原则跟单一职责原则有点类似,不过稍微还是有点区别。单一职责原则针对的是模块、类、接口......
  • 里斯替换原则 (设计模式)
    定义IfSisasubtypeofT,thenobjectsoftypeTmaybereplacedwithobjectsoftypeS,withoutbreakingtheprogram。Functionsthatusepointersofreferencestobaseclassesmustbeabletouseobjectsofderivedclasseswithoutknowingit。子类能够替......
  • C#程序全局异常处理—WPF和Web API两种模式
    C#程序的全局异常处理,网上搜下资料都是一大堆,我这里最近也是独立做一个B/S结构的小项目,后面又增加了需求用WPF实现相同的功能,这里将我所使用的全局异常处理方式做一个简短的总结分享。WebAPI项目的全局异常处理这种项目下,我们可以直接自定义一个全局异常的过滤器,用来处理全局......
  • 12.NET观察者模式,发布与订阅
    定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。——发布订阅模式发布订阅模式主要有两个角色:1.发布方(Publisher):也称为被观察者,当状态改变时负责通知所有订阅者。2.订阅方(Subscriber):也称为观察者,订阅事件并对接收到的......
  • 单一职责 (设计模式)
    定义一个类或者模块只复杂完成一个职责。也就是说,不要设计大而全的类,要设计力度小,功能单一的类。一个类包含两个以上和业务不相干的功能,应该将他拆分多个功能更加单一,粒度更加细化的类。 比如一个类力既含有订单的一些操作,又包含用户的一些操作,而订单和用户是两个独立的业务领......