Builder生成器(创建型模式)

摘要:
---设计模式GOF3.抽象图是软件的“主线”。当主线一侧的枝叶频繁变化时,4.在软件系统中使用Bulider模式的动机有时会面临这种“复杂对象”的创建,该对象通常由具有特定算法的每个组件的子对象组成;由于需求的变化,该对象的子对象经常面临如此剧烈的变化,但将它们组合在一起的算法非常稳定。

一、使用场景:

1、假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化。

如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方式,维护成本太高,而且如果对象极度复杂,那么很容易就会产生问题!

So,Builder  Pattern  is  userd to solve this   paogram!

2、意图

讲一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示。                                                                               ---设计模式《GOF》

3、抽象图

Builder生成器(创建型模式)第1张

当软件的"主线"

Builder生成器(创建型模式)第2张

比较稳定,当主线边上的枝枝叶叶变化频繁的话

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生成器的作用,让一个对象的部分创建过程,创建过程保持一致的同时,能创建出不同的实现.

免责声明:文章转载自《Builder生成器(创建型模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇记一次数据库的优化SwiftUI 官方教程(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Xmind常用快捷键

快捷鍵(WINDOWS)快捷鍵(MAC)描述Ctrl+NCommand+N建立新工作簿Ctrl+OCommand+O开启工作簿Ctrl+SCommand+S储存目前工作簿Ctrl+Shift+SCommand+Shift+S储存全部工作簿Ctrl+WCommand+W关闭目前工作簿Ctrl+Shift+WCommand+Shift+W关闭全部工作簿Ctrl+...

【资料】2021年最网红的FPGA开发板之一——DE10-Nano (SOC FPGA入门推荐!)

DE10 Nano开发板是2021最受欢迎的FPGA开发板之一。除了广泛应用于物联网、边缘计算、硬件加速、AI和EDA教育课程之外,许多爱好者还在网络上日益流行的开源复古游戏项目Mister中使用它。让我们来看看DE10 Nano提供的材料:Youjing官方网站上的材料(中文手册可用!!!23~课程培训材料2018产学合作培训材料基于2018产学协作培训材...

k8s集群上删除pod及service

删除k8s集群中的pod:找到pod的名称空间,并根据名称空间删除pod1。首先删除pod2,然后删除相应的部署。否则,删除pod是无用的。您还将看到pod,因为deployment.yaml文件中定义的副本数如下:delete the pod[root@test2~]#kubectlgetpod-njenkinsNAMEREADYSTATUSRESTART...

easyExcel自动合并单元格

importcom.alibaba.excel.write.handler.CellWriteHandler;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.util.CellRangeAddress;int[]mergeColumnIndex){this.mergeRowInd...

dbeaver 驱动安装

一、背景:在Windows10安装dbeaver数据库连接工具,点“测试连接”的时候出现报错如下:ErrorresolvingdependenciesMavenartifact'maven:/mysql:mysql-connector-java:RELEASE'nofound经网上查询是dbeaver驱动无法下载的问题。二、解决方法:打开“窗口”-˃“首选项...

nginx做本地目录映射

nginx做本地目录映射有时候需要访问服务器上的一些静态资源,比如挂载其他设备上的图片到本地的目录,而本地的目录不在nginx根目录下,这个时候就需要简单的做一下目录映射来解决,比如想通过浏览器http://ip/image/2016/04/29/10/abc.jpg访问到系统目录/image_data/2016/04/29/10/abc.jpg需要在ngi...