zoukankan      html  css  js  c++  java
  • 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/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I作业07:第十二周作业
    团队作业6--复审与事后分析
    Alpha阶段项目复审
    事后诸葛亮
    团队作业5——测试与发布(Alpha版本)
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/builder.html
Copyright © 2011-2022 走看看