• Builder生成器模式


    >>返回《C#常用设计模式》

    1. 简介

    生成器模式把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。

    适应于构建部分稳定不变,构建内容变动较频繁。将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    时序图

    2. 示例

    //使用的客户端类
    public class Client
    {
        public void Main()
        {
            //这里通过配置和反射 Assembly.Load  Activator.CreateInstance(Type) 实现
            House house= GameManager.CreateHouse(new RomainHouseBuilder());
        }
    }
    
    //相当于director
    public class GameManager
    {
        //该构建过程是相对稳定才能用此模式
        public static House CreateHouse(Builder builder)
        {
            builder.BuildWindows();
            builder.BuildWindows();
            builder.BuildDoor();
            builder.BuildWall();
            return builder.GetHouse();
        }
    }
    
    //抽象类的实现,当变动时将RomainHouseBuilder和RomainHouse换成新的
    public class RomainHouse:House
    { }
    public class RomainHouseBuilder : Builder
    {
        public override void BuildWindows() { }
        public override void BuildDoor() { }
        public override void BuildWall() { }
    }
    
    //为了适应变化定义的抽象类
    public abstract class House
    { }
    public abstract class Builder
    {
        public abstract void BuildWindows();
        public abstract void BuildDoor();
        public abstract void BuildWall();
    
        public abstract House GetHouse();
    }
    
    

    2.1. Dotnet框架中的示例

    HostBuilder通用主机的设计使用的就是生成器模式。

    public class Program
    {
        public static void Main(string[] args)
        {
            //创建HostBuilder
            CreateHostBuilder(args)
                //构建成Host对象
                .Build()
                //启动Host对象
                .Run();
        }
        static IHostBuilder CreateHostBuilder(string[] args) =>
            //创建Builder
            Host.CreateDefaultBuilder(args)
                //配置设置
                .ConfigureAppConfiguration((hostingContext, configuration) =>
                {
                    configuration.Sources.Clear();
                    IHostEnvironment env = hostingContext.HostingEnvironment;
                    configuration
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
                })
                //DI设置
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
                //日志设置
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.AddConsole();
                });
    }
    
    • 调用 CreateDefaultBuilder() 方法来创建和配置构建器对象。
    • 调用 Build() 创建一个IHost实例。
    • 在主机对象上调用 RunRunAsync 方法启动主机。

    3. 注意要点

    1. Builder模式主要用于"分步骤构建一个复杂的象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
    2. 变化点在哪里,封装哪里 —— Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。缺点在于难以应对“分步骤构建算法”的需求变动。
    3. Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决"对象部分”的需求变化。Builder模式通常和Composite(组合模式)组合使用。

    如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

    作者: 大师兄石头
    来源: https://bigbrotherstone.cnblogs.com/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    How can i use iptables on centos 7?
    Running Jenkins behind Nginx
    GPG入门教程
    HTML5 canvas标签-4 灰度直方图的实现
    [转载]手把手用C++解密Chrome80版本数据库
    Delphi
    7-zip Delphi API
    cef对本地web资源打包加密
    CEF3资源重定向、读取加密资源、读取zip资源
    axios设置withCredentials导致“跨域”的解决方案
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/builder.html
Copyright © 2020-2023  润新知