C#设计模式之抽象工厂

抽象工厂模式是一种创建型设计模式,用于提供一个统一的接口来创建相关或依赖对象的系列,而无需指定具体的类。当需要满足以下情况之一时,可以考虑使用抽象工厂模式:创建一组相关的产品:抽象工厂模式适用于创建一系列相关的产品,这些产品在实现上有共同的接口或基类。例如,创建不同操作系统的UI组件,如按钮、文本框等。系统需要独立于具体产品的创建和组合:通过使用抽象工厂模式,可以将产品的创建和使用代码分离。客户端只需依赖于抽象工厂接口,而无需关心具体产品的创建细节。抽象工厂模式的好处包括:封装变化:它将具体产品的创建封装在工厂接口中,使得客户端代码与具体产品的创建细节解耦。这样,如果需要更换或添加新的产品系列,只需要修改具体工厂的实现,而不会影响其他客户端代码。提供一致性:抽象工厂模式确保了通过同一工厂创建的产品系列是一致的,它们共享相同的接口或基类。这种一致性能够提供更高的灵活性和可扩展性。促进产品族的扩展:抽象工厂模式支持新增产品系列的扩展,在需要添加新产品时,只需创建新的具体产品和对应的具体工厂即可。而客户端代码无需修改,仍然通过抽象工厂接口来使用新的产品。然而,使用抽象工厂模式也有一些限制和注意事项:增加了系统的复杂性:引入抽象工厂会增加代码的数量和复杂性,特别是在有多个产品系列和不同的变体时。难以支持新增产品类:在已有的抽象工厂和具体工厂结构下,如果需要新增一个产品类,除了创建新的具体产品,还需要修改抽象工厂接口及其所有的具体工厂实现。综上所述,抽象工厂模式适用于需要创建一组相关产品,并希望将产品的创建与使用代码解耦的情况。它提供了灵活性、可扩展性和一致性,但也会增加系统的复杂性。因此,在设计时需要权衡使用抽象工厂模式所带来的好处和额外的复杂性。

题目如下:

假设你正在开发一个游戏,游戏中有不同类型的角色,包括"战士""法师"。每个角色都有对应的武器和装备,其中,战士可以使用剑和盾牌,法师可以使用魔杖和法术书。请使用抽象工厂模式设计一个角色工厂,该工厂根据传入的角色类型创建对应的角色对象,并能返回对应的武器和装备。要求:定义角色接口(IRole),包括一个方法用于展示角色信息;
实现战士和法师两个具体角色类(Warrior和Mage),分别实现角色接口;
定义武器接口(IWeapon)和装备接口(IEquipment),包括一个方法用于展示信息;
实现剑、盾牌、魔杖和法术书四个具体的武器和装备类,分别实现武器接口和装备接口;
定义一个抽象工厂接口(ICharacterFactory),包括创建角色、创建武器和创建装备的方法;
实现角色工厂类(CharacterFactory),实现抽象工厂接口,根据传入的角色类型创建对应的角色对象,并能返回对应的武器和装备。
请根据以上要求完成相应的类的设计和代码实现,并进行测试。

参考代码:

namespace AbsFactory
{internal interface IRole{void ShowRoleInfo();}
}
using System;namespace AbsFactory
{internal class Mage : IRole{public void ShowRoleInfo(){Console.WriteLine("这是一个法师角色");}}
}
using System;namespace AbsFactory
{internal class Warrior : IRole{public void ShowRoleInfo(){Console.WriteLine("这是一个战士角色");}}
}
namespace AbsFactory
{internal interface IEquipment{void ShowEquipmentInfo();}
}
namespace AbsFactory
{internal interface IWeapon{void ShowWeaponInfo();}
}
using System;namespace AbsFactory
{internal class Sword : IWeapon{public void ShowWeaponInfo(){Console.WriteLine("这是一把剑");}}
}
using System;namespace AbsFactory
{internal class SpellBook : IEquipment{public void ShowEquipmentInfo(){Console.WriteLine("这是一个法术书");}}
}
namespace AbsFactory
{internal interface ICharacterFactory{IRole CreateRole(string roleType);IWeapon CreateWeapon(string weaponType);IEquipment CreateEquipment(string equipmentType);}
}
using System;namespace AbsFactory
{internal class CharacterFactory : ICharacterFactory{public IEquipment CreateEquipment(string equipmentType){return Activator.CreateInstance(Type.GetType("AbsFactory." + equipmentType)) as IEquipment;}public IRole CreateRole(string roleType){// 根据需要创建具体的角色对象// 这里简单地根据类型名称创建,实际项目中可根据参数等更复杂的逻辑来创建return Activator.CreateInstance(Type.GetType("AbsFactory." + roleType)) as IRole;}public IWeapon CreateWeapon(string weaponType){// 根据需要创建具体的武器对象// 这里简单地根据类型名称创建,实际项目中可根据参数等更复杂的逻辑来创建return Activator.CreateInstance(Type.GetType("AbsFactory." + weaponType)) as IWeapon;}}
}
namespace AbsFactory
{internal class Program{static void Main(string[] args){ICharacterFactory characterFactory = new CharacterFactory();IRole mageRole = characterFactory.CreateRole("Warrior");IWeapon weapon = characterFactory.CreateWeapon("Sword");IEquipment shield = characterFactory.CreateEquipment("Shield");mageRole.ShowRoleInfo();weapon.ShowWeaponInfo();shield.ShowEquipmentInfo();IRole warriorRole = characterFactory.CreateRole("Mage");IWeapon wand = characterFactory.CreateWeapon("Wand");IEquipment spellBook = characterFactory.CreateEquipment("SpellBook");warriorRole.ShowRoleInfo();wand.ShowWeaponInfo();spellBook.ShowEquipmentInfo();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30岁程序员第一次失败的餐饮创业经历

背景介绍 我什么都比较晚,我比大多数人晚了两年毕业,事业稳定也比别人晚。直到去年,我才跳槽到一家外企外包工作获得相对满意的薪资。但即使如此,与更有经验的人相比,我仍然有很大的差距,自己也尚未积累足…

[CKA]考试之PersistentVolumeClaims

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 创建一个名字为pv-volume的pvc,指定storageClass为csi-hostpath-…

HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签(Tag)⭐元素(Element)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

Leetcode-每日一题【剑指 Offer 17. 打印从1到最大的n位数】

题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n 1输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 解题思路 前置知识 M…

嵌入式面试八股文

一、C/C题目 1.1.strcat、strncat、strcmp、strcpy,那些会导致内存溢出?如何改进? strcmp:与内存溢出没有关系,其功能为比较两个字符串是否相等。strcpy:把源字符串拷贝到目的内存中,如果源字符…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb默认存储类,为gitlab pods提供持久化存储&…

将word每页页眉单独设置

在进行论文排版的时候,总是会出现页眉的页码设置问题,比如出现奇数或偶数页码一致,尝试将前面页码改掉,后面再修改前面也进行了变动,将每页页眉单独设置: (1)在第一页的最后一行输入…

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…

智能指针shared_ptr:自定义删除器

重点&#xff1a; 1.普通指针转化成智能指针。 2.智能指针创建的时候&#xff0c;第二个参数是自定义删除器&#xff0c;默认情况下&#xff0c;shared_ptr调用delete()函数。 class A { public:void Get() { cout << b << endl; }; private:int b{ 10 }; };clas…

Pandas

系列文章目录 第一章 python数据挖掘基础环境安装和使用 第二章 Matplotlib 第三章 Numpy 文章目录 系列文章目录一、介绍1.1 为什么用Pandas&#xff1f;1.2 核心数据结构1.3 DataFrame1.3.1 结构1.3.2 常用属性1.3.3 常用方法1.3.4 DataFrame索引的设置修改行列索引值重设索…

git仓库与本地暂存区的同步问题

向下同步 对于远程仓库的项目&#xff0c;初始化一个配置文件&#xff0c;配置远程仓库及相关信息&#xff0c;赋值远程仓库的地址&#xff0c;使用git pull命令即可拉取仓库代码。 git pull [remote_addr] 该部分完成向下同步 向上同步 向上同步时会遇到很多的问题&#xf…

utf8mb4_general_ci 和utf8mb4_unicode_ci有什么异同,有什么优劣

utf8mb4_general_ci 和 utf8mb4_unicode_ci 都是 MySQL 数据库中的字符集和排序规则&#xff08;collation&#xff09;。它们主要用于指定字符数据的排序和比较规则&#xff0c;以确保在数据库中对字符串进行查询和比较时得到正确的结果。 异同点&#xff1a; 1. utf8mb4_gen…

Redis ERR Protocol error: invalid multibulk length

异常信息 org.springframework.data.redis.RedisConnectionFailureException: ERR Protocol error: invalid multibulk length; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: ERR Protocol error: invalid multibulk lengthCaused by: red…

《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)

1. 简介 俗话说&#xff1a;磨刀不误砍柴工&#xff0c;因此在我们要开始写自动化脚本之前&#xff0c;我们先来学习和了解几个基本概念&#xff0c;在完全掌握了这几个概念之后&#xff0c;有助于我们快速上手&#xff0c;如何去编写自动化测试脚本。 元素&#xff0c;在这个…

vue-制作自动滚动效果

第一步&#xff1a;下载 可以查看官方地址chenxuan0000 npm i vue-seamless-scroll -save 第二步&#xff1a;引用 import vueSeamlessScroll from "vue-seamless-scroll";//注册components: {vueSeamlessScroll,}, 第三步&#xff1a;使用 <vue-seamless…

MongoDB面试题

1. NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什么要使用和不使用 NoSQL 数据库?说一说 NoSQL 数据库的几个优点? NoSQL 是非关系型数据库&#xff0c;NoSQL Not Only SQL。 关系型数据库采用的结构化的数据&#xff0c;NoSQL 采用的是键值对的方式存储数…

常用数据处理方式

文章目录 一、不同格式数据读取及转换split data into X and y二、数据预处理1、去重2、删除某一列3、删除两行4、date转字符串5、修改类型6、修改日期类型7、修改字段名8、加年月9、 删除字段10、 查看数据中顶部10%的数据11、设置索引12、判断空值13、排序14、 模糊查询15、修…

linux部署springboot项目中文乱码

问题描述&#xff1a; 将springboot项目打成jar包部署到linux服务器发现中文乱码 解决办法&#xff1a; java -Dfile.encodingutf-8 -jar xxxxx.jar转载至&#xff1a;https://blog.csdn.net/qq_39706515/article/details/119807632

Java---使用lombok简化实体类的编写----不要再写getter+sertter方法了

目录 使用lombok简化实体类的编写 首先&#xff1a; 加入lombok依赖&#xff1a; 然后 加上一个注解&#xff1a;Data 使用lombok简化实体类的编写 首先&#xff1a; 加入lombok依赖&#xff1a; <dependency><groupId>org.projectlombok</groupId>…

【问题随记】

ubuntu 14.04源更新(sources.list) deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-update…