Builder生成器(创建型模式)
Posted Green.Leaf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Builder生成器(创建型模式)相关的知识,希望对你有一定的参考价值。
一、使用场景:
1、假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化。
如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方式,维护成本太高,而且如果对象极度复杂,那么很容易就会产生问题!
So,Builder Pattern is userd to solve this paogram!
2、意图
讲一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示。 ---设计模式《GOF》
3、抽象图
当软件的"主线"
比较稳定,当主线边上的枝枝叶叶变化频繁的话
4、Bulider模式的使用动机
在软件系统中,有时候面临这一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个对象的子对象经常面临这剧烈的变化,但是将它们组合在一起的算法却非常的稳定。
那么如何应对这种变化?如何提供一种"封装机制"来隔离出复杂对象各个部分的变化,从而保证系统中的稳定构建算法不随需求的变化而变化?
5、Buidler模式的使用意图
将一个复杂的对象的构建过程与其表示相分离,使得同样的构建过程可以创建出不同的表示
6、具体案例
需求如下:一个抽象游戏系统,该系统的变化较慢(趋于稳定),该系统需要能构建不同风格的房屋,而且不同风格的房屋的组成部分(如门、窗)等能动态扩展.
代码如下:
/// <summary> /// Builder生成器模式(创建型模式) /// </summary> public class Builder { public class BuildSystem { public void Build(House house) { var houseTypeName = house.GetType().Name; var houseInsantce=house.CreateHouse(houseTypeName); } } #region 抽象 /// <summary> /// 房屋抽象 /// </summary> public abstract class House { public abstract Window Window { get; set; } public abstract Door Door { get; set; } public abstract House CreateHouse(string builerTypeName); } /// <summary> /// 房屋生成器抽象 /// </summary> public abstract class HouseBuilder { /// <summary> /// 窗户构建方法 /// </summary> /// <returns></returns> public abstract void BuildWindow(); /// <summary> /// 门构建方法 /// </summary> /// <returns></returns> public abstract void BuildDoor(); /// <summary> /// 按照一定的逻辑组装构成部分,返回一个House实例 /// </summary> /// <returns></returns> public abstract House GetHouse(); } /// <summary> /// 房屋构成一窗户抽象 /// </summary> public abstract class Window { } /// <summary> /// 房屋构成一门抽象 /// </summary> public abstract class Door { } #endregion #region 具体实现 public class ModernHouse : House { public override Window Window { get; set; } public override Door Door { get; set; } public override House CreateHouse(string builerTypeName) { var builderTypeName = ConfigurationManager.AppSettings["ModernHouse"] as string; //根据配置文件加载当前程序集获取传入风格房屋对应的Buider生成器类,生成对应的风格的房屋 var assembly = Assembly.LoadFile(@"F:\\小超-基础框架\\ZCBase\\Demo\\DesignMode\\CreateDesginMode\\bin\\Debug\\CreateDesginMode.exe"); var buildType = assembly.GetTypes().FirstOrDefault(f => f.Name.Equals(builderTypeName)); var instance = Activator.CreateInstance(buildType) as HouseBuilder; var house = instance.GetHouse(); return house; } } public class ModernWindow : Window { } public class ModernDoor : Door { } /// <summary> /// 现代化房屋构建方法 /// </summary> public class ModernHouseBuilder : HouseBuilder { private ModernDoor _moderDoor; private Window _window; public override void BuildDoor() { _moderDoor=new ModernDoor(); } public override void BuildWindow() { _window = new ModernWindow(); } public override House GetHouse() { BuildDoor(); BuildWindow(); var modernHouse = new ModernHouse(); modernHouse.Door = _moderDoor; modernHouse.Window = _window; return modernHouse; } } #endregion }
配置文件代码如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="ModernHouse" value="ModernHouseBuilder" /> </appSettings> </configuration>
客户端调用代码如下:
/// <summary> /// 创建型设计模式 /// </summary> class Program { static void Main(string[] args) { { //Builder生成器调用客户端 BuildSystem buildSystem = new BuildSystem(); buildSystem.Build(new ModernHouse()); } Console.ReadKey(); } }
通过配置文件的方式,动态地配置不同风格的房屋对应的房屋Builder来实现需求,该方法能很好的满足需求,这就是Builder生成器的作用,让一个对象的部分创建过程,创建过程保持一致的同时,能创建出不同的实现.
以上是关于Builder生成器(创建型模式)的主要内容,如果未能解决你的问题,请参考以下文章