找回密码
 立即注册
首页 业界区 业界 设计模式(四)建造者

设计模式(四)建造者

驼娑 2025-6-9 00:13:13
一、定义

讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种创建型模式。
二、描述

包含以下四个角色:
1.png
1、Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法:一类是BuildPartX(),用于创建复杂对象的各个部件;另一类是GetResult(),用于返回生成好的复杂对象。Builder既可以是抽象类,也可以是接口。
2、ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品(该方法也可以由抽象建造者实现)。
3、Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
4、Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其Construct()方法中调用建造者对象的部件构造和装配方法,完成复杂对象的建造。客户端一般只需要和指挥者进行交互,在客户端确定具体建造者类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥类中。
三、例子

X公司要开发一款角色类游戏,角色根据不同情境具有不同能力,并且随着升级增强。角色是个复杂的对象,不同角色其性别、面容、服装、发型等都有所差异。无论何种角色,创建步骤都大同小异,都需要分步骤创建组成部分,再装配成一个完整的角色。
2.png
Actor:角色类复杂产品,实际业务较为复杂,示例简化只列出部分属性且类型为string
  1. public class Actor
  2. {
  3.     //角色类型
  4.     public string Type { get; set; }
  5.     //性别
  6.     public string Sex { get; set; }
  7.     //面容
  8.     public string Face { get; set; }
  9.     //服装
  10.     public string Costume { get; set; }
  11.     //发型
  12.     public string HairStyle { get; set; }
  13. }
复制代码
ActorBuilder:游戏角色建造器,充当抽象建造者
  1. public abstract class ActorBuilder
  2. {
  3.     protected Actor actor = new Actor();
  4.     public abstract void BuildType();
  5.     public abstract void BuildSex();
  6.     public abstract void BuildFace();
  7.     public abstract void BuildCostume();
  8.     public abstract void BuildHairStyle();
  9.     // 工厂方法 : 返回一个完整的游戏角色对象
  10.     public Actor CreateActor()
  11.     {
  12.         return actor;
  13.     }
  14. }
复制代码
HeroBuilder、AngelBuilder和DevilBuilder:英雄角色、天使角色、魔鬼角色,充当具体建造者。
  1. public class HeroBuilder : ActorBuilder
  2. {
  3.     public override void BuildType()
  4.     {
  5.         actor.Type = "英雄";
  6.     }
  7.     public override void BuildSex()
  8.     {
  9.         actor.Sex = "男";
  10.     }
  11.     public override void BuildFace()
  12.     {
  13.         actor.Face = "英俊";
  14.     }
  15.     public override void BuildCostume()
  16.     {
  17.         actor.Costume = "盔甲";
  18.     }
  19.     public override void BuildHairStyle()
  20.     {
  21.         actor.HairStyle = "飘逸";
  22.     }
  23. }
  24. public class AngelBuilder : ActorBuilder
  25. {
  26.     public override void BuildType()
  27.     {
  28.         actor.Type = "天使";
  29.     }
  30.     public override void BuildSex()
  31.     {
  32.         actor.Sex = "女";
  33.     }
  34.     public override void BuildFace()
  35.     {
  36.         actor.Face = "漂亮";
  37.     }
  38.     public override void BuildCostume()
  39.     {
  40.         actor.Costume = "白裙";
  41.     }
  42.     public override void BuildHairStyle()
  43.     {
  44.         actor.HairStyle = "披肩长发";
  45.     }
  46. }
  47. public class DevilBuilder : ActorBuilder
  48. {
  49.     public override void BuildType()
  50.     {
  51.         actor.Type = "恶魔";
  52.     }
  53.     public override void BuildSex()
  54.     {
  55.         actor.Sex = "妖";
  56.     }
  57.     public override void BuildFace()
  58.     {
  59.         actor.Face = "丑陋";
  60.     }
  61.     public override void BuildCostume()
  62.     {
  63.         actor.Costume = "黑衣";
  64.     }
  65.     public override void BuildHairStyle()
  66.     {
  67.         actor.HairStyle = "光头";
  68.     }
  69. }
复制代码
ActorController:角色控制器,充当指挥者
  1. public class ActorController
  2. {
  3.     public Actor Construct(ActorBuilder builder)
  4.     {
  5.         builder.BuildType();
  6.         builder.BuildSex();
  7.         builder.BuildFace();
  8.         builder.BuildCostume();
  9.         builder.BuildHairStyle();
  10.         return builder.CreateActor(); ;
  11.     }
  12. }
复制代码
Program:测试代码
  1. ActorBuilder ab = new HeroBuilder();
  2. ActorController ac = new ActorController();
  3. Actor at = ac.Construct(ab);
  4. Console.WriteLine(at.Type);
  5. Console.WriteLine(at.Sex);
  6. Console.WriteLine(at.Face);
  7. Console.WriteLine(at.Costume);
  8. Console.WriteLine(at.HairStyle);
  9. Console.ReadLine();
复制代码
3.png

四、总结

1、优点

(1)在建造者模式中,客户端不必知道产品内部的组成细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
(2)没一个具体建造者都相对独立,与其他的具体建造者无关,因此新增与替换具体建造者很方便,由于指挥者类针对抽象建造者编程,增加新的具体建造者无需修改原有类库的代码,系统扩展比较方便,符合开闭原则
(3)用户可以更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
2、缺点

(1)建造者模式所创建产的品都具有一些较多的共同点,其组成部分相似,如果差异性很大,例如很多组成部分不同,那么则不适合使用建造者模式。
(2)如果产品的内部结构复杂多变,可能会需要定义很多具体构建者来实现这些变化,导致系统变得很庞大,增加了系统的理解难度和运行成本

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册