首页 > 编程语言 >C#设计模式之建造者模式

C#设计模式之建造者模式

时间:2022-11-11 18:12:07浏览次数:67  
标签:C# Weapon 建造 Builder void 武器 设计模式 public

 

 原文网址:https://www.jb51.net/article/254976.htm

场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商人进行锻造,最后把产品给冒险者,用建造者模式如何实现?

1.什么是建造者模式?

之前写过简单工厂、工厂方法以及抽象工厂,这些东西都是创建型设计模式,同样建造者模式也是一种创建型的设计模式,也叫生成器模式。

书上的解释:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

四个要素

  • Product:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
  • Builder:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • ConcreteBuilder:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
  • Director:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

2.实现场景

分析场景:

Product就好比是场景中生成的武器(刀和剑)

Builder 就好比武器商人(抽象锻造方法)

ConcreteBuilder 刀和剑的具体锻造方式

Director 就是冒险者,指挥武器商人进行产品的锻造

Weapon.cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Weapon {     //定义一个List用来存储武器的每一个部分     IList<string> parts = new List<string>();     //定义一个方法组装武器     public void Combine(string part)     {         parts.Add(part);     }     //将每一个部分打印出来     public void show()     {         Console.WriteLine("---------");         foreach (var part in parts)         {             Console.WriteLine(part);         }     } }
 

Builder.cs

public abstract class Builder {     //生成武器主体部分     public abstract void CreateMainPart();     //生成武器其他部分     public abstract void CreateOtherPart();     //返回武器     public abstract Weapon ReturnWeapon(); }

KnifeBuilder.cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class KnifeBuilder : Builder {       private Weapon Knife = new Weapon();       public override void CreateMainPart()     {         Knife.Combine("添加了刀身");     }       public override void CreateOtherPart()     {         Knife.Combine("添加了刀把");     }       public override Weapon ReturnWeapon()     {         return Knife;     } }

SwordBuilder.cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class SwordBuilder:Builder {     private Weapon Sword = new Weapon();       public override void CreateMainPart()     {         Sword.Combine("添加了剑身");     }       public override void CreateOtherPart()     {         Sword.Combine("添加了剑柄");     }       public override Weapon ReturnWeapon()     {         return Sword;     } }

Adventurer.cs

1 2 3 4 5 6 7 8 public class Adventurer {     public void Buy(Builder b)     {         b.CreateMainPart();         b.CreateOtherPart();     } }

客户端

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Program {     static void Main(string[] args)     {         Adventurer adventurer = new Adventurer();         Builder swordBuilder = new SwordBuilder();         Builder knifeBuilder = new KnifeBuilder();           adventurer.Buy(swordBuilder);         Weapon sword = swordBuilder.ReturnWeapon();         sword.show();           adventurer.Buy(knifeBuilder);         Weapon knife = knifeBuilder.ReturnWeapon();         knife.show();           Console.ReadLine();     } }

结果:

到此这篇关于C#设计模式之建造者模式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 

标签:C#,Weapon,建造,Builder,void,武器,设计模式,public
From: https://www.cnblogs.com/bruce1992/p/16881345.html

相关文章

  • CentOS 7 安装 ElasticSearch 8.5
    参考:InstallElasticsearchfromarchiveonLinuxorMacOS|ElasticsearchGuide[8.5]|ElasticInstallKibanafromarchiveonLinuxormacOS|KibanaGuide[......
  • 借助 ONLYOFFICE 宏在电子表格中隐藏选择的特定行
    使用电子表格的过程中,有时我们需要将某些行隐藏起来,这样在操作规模比较大的数据块时能更加方便。在本文中,我们将向您展示如何使用一个小而精巧的ONLYOFFICE宏来实现此功能......
  • console 简介与用法
    console简介与用法alert 弹窗早年没有console,用的都是 alert() 来调试;关于alert() 的几个小问题:alert(1,2,3);//只会弹出1;alert只有接受一个......
  • openGauss SEQUENCE函数
    SEQUENCE函数序列函数为用户从序列对象中获取后续的序列值提供了简单的多用户安全的方法。nextval(regclass)描述:递增序列并返回新值。​说明:为了避免从同一个序列获取值的......
  • RocketMQ 在物流行业的应用与运维
    本文作者:丁威-中通快递资深架构师,《RocketMQ技术内幕》作者,ApacheRocketMQ社区首席布道师,公众号「中间件兴趣圈」维护者。01物流行业的业务特点物流行业有三大业务特点:业......
  • CodeQL的自动化代码审计之路(上篇)
    0x01前言最近关于CodeQL的概念很火,大家普遍认为这会是下一代的代码审计神器。网上关于CodeQL的文章已经有不少,但是多数文章还是在分析CodeQL的安装和简单使用用例。真正使......
  • SAVENCIA携新品五度亮相进博会 倡导美食健康理念
    近日第五届中国国际进口博览会于上海隆重举办,全球性食品集团SAVENCIASaveurs&Spécialité,领衔旗下爱乐薇、法芙娜、百吉福、蔻曼、新悦纯牧、莱斯居尔等多个知名品牌,五......
  • spring中有多少种IOC容器
    BeanFactory:就像一个包含bean集合的工厂类,它会在客户端要求实时实例化bean。ApplicationContext:接口扩展了BeanFactory接口,它在BeanFactory基础上提供了一些额外的功能。B......
  • 老司机必备的手机浏览器,比UC浏览器还好用
    各位听得最多的段子:老司机们,上车了。没错,不管是在电脑端还是移动端,都需要一款好用的浏览器。那么,老司机们都用什么浏览器,什么样的浏览器才是老司机必备的浏览器呢?来咯,这些......
  • parceljs 2.8 整合 vue 及解决其他 bug
    问题vue2打包报错https://blog.csdn.net/C_ZhangSir/article/details/100989902解决:引入importVuefrom'vue/dist/vue';parcel中文路径导致打包出错https://blo......