设计模式之:建造者模式BuilderPattern的实现
建造者模式相较于工厂模式,用于创建复杂的对象;
使用的技术:继承、抽象类、多态、配置文件、反射;
建造者模式的设计原则:
- 面向抽象类编程,符合依赖倒置原则;
- 通过配置文件生成具体建造者,替代抽象建造者,符合里氏替换原则;
- 不同的建造者建造不同的角色,符合单一职责原则;
- 客户端只需调用建造者生成角色对象,而不需要之道具体的实现细节,符合迪米特法则;
- 生成不同角色,只需更改配置文件,无须更改源代码,符合开闭原则;
- 扩展新的角色,只需增加新的角色类和新的建造者类,无须更改源代码,符合开闭原则;
类图 with StarUML
角色类
internal class Actor { private string type; private string sex; private string face; private string costume; private string hairstyle; public string Type { get => type; set => type = value; } public string Sex { get => sex; set => sex = value; } public string Face { get => face; set => face = value; } public string Costume { get => costume; set => costume = value; } public string Hairstyle { get => hairstyle; set => hairstyle = value; } }
建造者抽象类及3个实现类
internal abstract class ActorBuilder { protected Actor actor = new Actor(); public abstract void BuildType(); public abstract void BuildSex(); public abstract void BuildFace(); public abstract void BuildCostume(); public abstract void BuildHairstyle(); public Actor CreateActor() { return actor; } }
internal class DevilBuilder : ActorBuilder { public override void BuildCostume() { actor.Costume = "黑衣"; } public override void BuildFace() { actor.Face = "丑陋"; } public override void BuildHairstyle() { actor.Hairstyle = "光头"; } public override void BuildSex() { actor.Sex = "男"; } public override void BuildType() { actor.Type = "恶魔"; } }
internal class AngelBuilder : ActorBuilder { public override void BuildCostume() { actor.Costume = "白裙"; } public override void BuildFace() { actor.Face = "漂亮"; } public override void BuildHairstyle() { actor.Hairstyle = "披肩长发"; } public override void BuildSex() { actor.Sex = "女"; } public override void BuildType() { actor.Type = "天使"; } }
internal class HeroBuilder : ActorBuilder { public override void BuildCostume() { actor.Costume = "盔甲"; } public override void BuildFace() { actor.Face = "英俊"; } public override void BuildHairstyle() { actor.Hairstyle = "飘逸"; } public override void BuildSex() { actor.Sex = "男"; } public override void BuildType() { actor.Type = "英雄"; } }
角色控制器类,充当指挥者
internal class ActorController { public Actor Construct(ActorBuilder builder) { Actor actor; builder.BuildCostume(); builder.BuildFace(); builder.BuildHairstyle(); builder.BuildSex(); builder.BuildType(); actor = builder.CreateActor(); return actor; } }
配置文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="builderType" value="BuilderPattern.AngelBuilder"/> </appSettings> </configuration>
客户端
internal class Program { static void Main(string[] args) { Actor actor; //面向抽象编程 ActorBuilder builder; //加载配置文件 string builderType = ConfigurationManager.AppSettings["builderType"]; //通过反射创建对象 builder = Assembly.Load("BuilderPattern").CreateInstance(builderType) as ActorBuilder; ActorController controller = new ActorController(); actor = controller.Construct(builder); Console.WriteLine($"类型:{actor.Type}"); Console.WriteLine($"性别:{actor.Sex}"); Console.WriteLine($"面容:{actor.Face}"); Console.WriteLine($"服装:{actor.Costume}"); Console.WriteLine($"发型:{actor.Hairstyle}"); Console.Read(); } }
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律