zoukankan      html  css  js  c++  java
  • 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:小超-基础框架CBaseDemoDesignModeCreateDesginModeinDebugCreateDesginMode.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生成器的作用,让一个对象的部分创建过程,创建过程保持一致的同时,能创建出不同的实现.

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/6464085.html
Copyright © 2011-2022 走看看