田敏
返回博客列表
技术

建造者模式

田敏
2024-07-312 分钟阅读
Design PatternSoftware Engineering

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

**意图:**将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

**主要解决:**主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

**何时使用:**一些基本部件不会变,而其组合经常变化的时候。

a4571895cd2b80d02d0d6b09ed0155a6

对于以下代码:

using System;

// 产品类
class Computer
{
    public string CPU { get; set; }
    public string Memory { get; set; }
    public string HardDisk { get; set; }
    public string Screen { get; set; }

    public void Display()
    {
        Console.WriteLine($"Computer Config: CPU - {CPU}, Memory - {Memory}, HardDisk - {HardDisk}, Screen - {Screen}");
    }
}

// 客户端代码
class Program
{
    static void Main()
    {
        // 创建高配置电脑
        Computer highConfigComputer = new Computer();
        highConfigComputer.CPU = "High-End CPU";
        highConfigComputer.Memory = "16GB RAM";
        highConfigComputer.HardDisk = "1TB SSD";
        highConfigComputer.Screen = "4K Display";

        // 显示高配置电脑信息
        highConfigComputer.Display();

        // 创建低配置电脑
        Computer lowConfigComputer = new Computer();
        lowConfigComputer.CPU = "Basic CPU";
        lowConfigComputer.Memory = "4GB RAM";
        lowConfigComputer.HardDisk = "500GB HDD";
        lowConfigComputer.Screen = "HD Display";  // 低配置电脑也设置了屏幕属性,实际上可能不需要

        // 显示低配置电脑信息
        lowConfigComputer.Display();
    }
}

在上述代码中,客户端直接实例化 Computer 类并设置其属性,然后调用 Display 方法显示电脑的配置信息。这种方式的缺点在于:

  1. 配置过程与产品类混合在一起,难以清晰地分离构建逻辑。
  2. 如果产品类的构建逻辑变化或需要新增属性,客户端代码需要进行相应修改,可能引入错误。
  3. 可能会设置不必要的属性,如在低配置电脑中也设置了屏幕属性。

如果使用建造者模式:

using System;

// 产品类
class Computer
{
    public string CPU { get; set; }
    public string Memory { get; set; }
    public string HardDisk { get; set; }
    public string Screen { get; set; }

    public void Display()
    {
        Console.WriteLine($"Computer Config: CPU - {CPU}, Memory - {Memory}, HardDisk - {HardDisk}, Screen - {Screen}");
    }
}

// 抽象建造者接口
interface IComputerBuilder
{
    IComputerBuilder BuildCPU(string cpu);
    IComputerBuilder BuildMemory(string memory);
    IComputerBuilder BuildHardDisk(string hardDisk);
    IComputerBuilder BuildScreen(bool includeScreen);
    Computer GetComputer();
}

// 具体建造者A
class HighConfigComputerBuilder : IComputerBuilder
{
    private Computer computer = new Computer();

    public IComputerBuilder BuildCPU(string cpu)
    {
        computer.CPU = cpu;
        return this;
    }

    public IComputerBuilder BuildMemory(string memory)
    {
        computer.Memory = memory;
        return this;
    }

    public IComputerBuilder BuildHardDisk(string hardDisk)
    {
        computer.HardDisk = hardDisk;
        return this;
    }

    public IComputerBuilder BuildScreen(bool includeScreen)
    {
        if (includeScreen)
        {
            computer.Screen = "4K Display";
        }
        return this;
    }

    public Computer GetComputer()
    {
        return computer;
    }
}

// 具体建造者B
class LowConfigComputerBuilder : IComputerBuilder
{
    private Computer computer = new Computer();

    public IComputerBuilder BuildCPU(string cpu)
    {
        computer.CPU = cpu;
        return this;
    }

    public IComputerBuilder BuildMemory(string memory)
    {
        computer.Memory = memory;
        return this;
    }

    public IComputerBuilder BuildHardDisk(string hardDisk)
    {
        computer.HardDisk = hardDisk;
        return this;
    }

    public IComputerBuilder BuildScreen(bool includeScreen)
    {
        if (includeScreen)
        {
            computer.Screen = "HD Display";
        }
        return this;
    }

    public Computer GetComputer()
    {
        return computer;
    }
}

// 导演类
class Director
{
    public void Construct(IComputerBuilder builder, bool includeScreen)
    {
        builder
            .BuildCPU("Basic CPU")
            .BuildMemory("4GB RAM")
            .BuildHardDisk("500GB HDD")
            .BuildScreen(includeScreen);
    }
}

// 客户端代码
class Program
{
    static void Main()
    {
        Director director = new Director();

        IComputerBuilder highConfigBuilder = new HighConfigComputerBuilder();
        director.Construct(highConfigBuilder, true); // A需要屏幕
        Computer highConfigComputer = highConfigBuilder.GetComputer();
        highConfigComputer.Display();

        IComputerBuilder lowConfigBuilder = new LowConfigComputerBuilder();
        director.Construct(lowConfigBuilder, false); // B不需要屏幕
        Computer lowConfigComputer = lowConfigBuilder.GetComputer();
        lowConfigComputer.Display();
    }
}

建造者模式主要有以下作用和优势:

  1. 封装构建过程:
    • 建造者模式将一个复杂对象的构建过程封装在一个独立的构造者类中,使得客户端不需要知道对象的具体构建细节。这样可以降低客户端与具体构建过程的耦合度。
  2. 创建复杂对象:
    • 当需要创建的对象具有多个组成部分,且这些部分的创建过程相对独立、复杂时,建造者模式提供了一种有序构建的方式,使得客户端能够更加灵活地构建对象。
  3. 支持变化构建过程:
    • 建造者模式允许客户端按照特定的构建步骤组合不同的部分,从而构建不同的对象。这样在构建过程中的变化,不会影响到客户端代码。
  4. 避免构造器重载问题:
    • 当一个类的构造器参数过多或者参数排列组合较多时,通过构造器进行对象创建会导致构造器的重载问题,影响代码的可读性和可维护性。建造者模式可以有效避免这个问题,将构建参数通过一个个方法设置,链式调用提高了代码的可读性。
  5. 创建不可变对象:
    • 通过建造者模式,可以创建不可变对象,即对象在创建后不可修改。这有助于确保对象的状态不会在创建后被篡改,提高了对象的安全性。
  6. 支持链式调用:
    • 建造者模式支持链式调用,使得客户端能够一步步地设置对象的属性,代码更加简洁、流畅,提高了代码的可读性。
  7. 提高代码的可维护性:
    • 将构建过程分解成多个步骤,每个步骤由对应的构造者负责,使得代码更加模块化,易于扩展和维护。

总体来说,建造者模式的作用是通过将一个复杂对象的构建过程分解成多个简单对象的构建过程,使得客户端能够更加灵活、清晰地创建复杂对象,同时提高了代码的可维护性和可读性。

实验室需求开发类:

1、联赢PLC、MES交互

2、ATL功能同步整合验证

3、智能电表数据采集

4、通道停止/完成测试时,温箱控制屏可操作

5、压力外设数据单独生成sheet页。

(60)底线值:1.5倍开发周期内完成,且无严重问题;

(100)达标值:按期完成开发,且无严重问题;

(120)挑战值:提前开发完成,且无任何问题;

1、学习和PLC之间的交互,以及向有相关经验的同事请教可能出现的问题进行避免,如期完成项目开发;

2、将ATL功能整合到最新版本,编写测试方案提交测试部,解决测试部的问题

3、学习和电表的交互协议,完成开发;

4、

5、保证报表导出速度

1、在7.22之前完成开发,在7.29之前完成产线的调试;

2、在7.19之前将软件提交测试部,在7.29之前完成测试部门的测试问题,提交现场使用;

3、在项目开始的一周内完成开发,下周三之前提交现场使用;

4、在项目开始的一周内完成开发,下周三之前提交现场使用;

5、在项目开始的一周内完成开发,下周三之前提交现场使用;

EOL需求开发及现场调试

1、温州瑞浦ML5项目开发及其调试及客户培训

2、汇鼎75项目开发及其调试

3、大族欣旺达项目

1、在客户提供完整资料之后,一周内完成开发,下周完成项目的调试(客户提供调试的环境的前提);

2、在7.29之前完成产线的调试及其开发(客户提供调试的环境的前提);

3、在客户提供完整资料之后,一周内完成开发,两周内完成项目的调试(客户提供调试的环境的前提);

1、对接客户需求完成测试项的调试,完成对应需求的开发及MES系统的对接

2、对接客户需求完成测试项的调试,完成对应需求的开发及MES系统的对接

3、根据新外设的协议完成对外设的控制,

1、厦门新能安现场维护

2、东莞维科现场维护

3、泰国比亚迪现场维护

4、南京欣旺达现场维护

5、广州南网科技现场维护

6、鸿日现场维护

市场问题解决

(60)门槛: 二次内解决常规问题

(100)达标: 快速定位问题并一次性解决常规问题

(120)挑战: 解决疑难问题

版权协议:MIT返回列表