C#建造者模式如何使用

发布时间:2022-10-21 09:38:32 作者:iii
来源:亿速云 阅读:147

C#建造者模式如何使用

目录

  1. 引言
  2. 建造者模式概述
  3. 建造者模式的结构
  4. C#实现建造者模式
  5. 建造者模式的优缺点
  6. 建造者模式与其他设计模式的比较
  7. 实际应用案例
  8. 总结
  9. 参考文献

引言

在软件开发中,设计模式是解决常见问题的经典解决方案。建造者模式(Builder Pattern)是一种创建型设计模式,它允许你逐步构建复杂对象,同时将构造过程与表示分离。本文将详细介绍如何在C#中使用建造者模式,并通过示例代码展示其实际应用。

建造者模式概述

定义

建造者模式是一种创建型设计模式,它允许你逐步构建复杂对象,同时将构造过程与表示分离。通过这种方式,你可以使用相同的构造过程创建不同的表示。

适用场景

建造者模式适用于以下场景: - 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 - 当构造过程必须允许被构造的对象有不同的表示时。

建造者模式的结构

角色

建造者模式通常包含以下几个角色: - Builder(建造者):定义创建产品各个部件的接口。 - ConcreteBuilder(具体建造者):实现Builder接口,构造和装配产品的各个部件。 - Director(指挥者):负责使用Builder接口来构建产品。 - Product(产品):表示被构造的复杂对象。

UML类图

classDiagram
    class Director {
        +Construct()
    }
    class Builder {
        <<interface>>
        +BuildPartA()
        +BuildPartB()
        +GetResult() : Product
    }
    class ConcreteBuilder {
        +BuildPartA()
        +BuildPartB()
        +GetResult() : Product
    }
    class Product {
        +AddPart(part)
    }
    Director --> Builder
    Builder <|.. ConcreteBuilder
    ConcreteBuilder --> Product

C#实现建造者模式

简单示例

以下是一个简单的C#示例,展示了如何使用建造者模式构建一个简单的产品。

// 产品类
public class Product
{
    private List<string> _parts = new List<string>();

    public void AddPart(string part)
    {
        _parts.Add(part);
    }

    public void Show()
    {
        Console.WriteLine("\nProduct Parts -------");
        foreach (string part in _parts)
            Console.WriteLine(part);
    }
}

// 建造者接口
public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    Product GetResult();
}

// 具体建造者
public class ConcreteBuilder : IBuilder
{
    private Product _product = new Product();

    public void BuildPartA()
    {
        _product.AddPart("Part A");
    }

    public void BuildPartB()
    {
        _product.AddPart("Part B");
    }

    public Product GetResult()
    {
        return _product;
    }
}

// 指挥者
public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        Director director = new Director();
        IBuilder builder = new ConcreteBuilder();

        director.Construct(builder);
        Product product = builder.GetResult();
        product.Show();
    }
}

复杂示例

以下是一个更复杂的示例,展示了如何使用建造者模式构建一个包含多个部件的复杂对象。

// 产品类
public class Computer
{
    private string _cpu;
    private string _ram;
    private string _storage;

    public void SetCPU(string cpu)
    {
        _cpu = cpu;
    }

    public void SetRAM(string ram)
    {
        _ram = ram;
    }

    public void SetStorage(string storage)
    {
        _storage = storage;
    }

    public void Show()
    {
        Console.WriteLine("\nComputer Configuration -------");
        Console.WriteLine($"CPU: {_cpu}");
        Console.WriteLine($"RAM: {_ram}");
        Console.WriteLine($"Storage: {_storage}");
    }
}

// 建造者接口
public interface IComputerBuilder
{
    void BuildCPU();
    void BuildRAM();
    void BuildStorage();
    Computer GetResult();
}

// 具体建造者
public class GamingComputerBuilder : IComputerBuilder
{
    private Computer _computer = new Computer();

    public void BuildCPU()
    {
        _computer.SetCPU("Intel Core i9");
    }

    public void BuildRAM()
    {
        _computer.SetRAM("32GB DDR4");
    }

    public void BuildStorage()
    {
        _computer.SetStorage("1TB SSD");
    }

    public Computer GetResult()
    {
        return _computer;
    }
}

public class OfficeComputerBuilder : IComputerBuilder
{
    private Computer _computer = new Computer();

    public void BuildCPU()
    {
        _computer.SetCPU("Intel Core i5");
    }

    public void BuildRAM()
    {
        _computer.SetRAM("16GB DDR4");
    }

    public void BuildStorage()
    {
        _computer.SetStorage("512GB SSD");
    }

    public Computer GetResult()
    {
        return _computer;
    }
}

// 指挥者
public class ComputerDirector
{
    public void Construct(IComputerBuilder builder)
    {
        builder.BuildCPU();
        builder.BuildRAM();
        builder.BuildStorage();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        ComputerDirector director = new ComputerDirector();

        IComputerBuilder gamingBuilder = new GamingComputerBuilder();
        director.Construct(gamingBuilder);
        Computer gamingComputer = gamingBuilder.GetResult();
        gamingComputer.Show();

        IComputerBuilder officeBuilder = new OfficeComputerBuilder();
        director.Construct(officeBuilder);
        Computer officeComputer = officeBuilder.GetResult();
        officeComputer.Show();
    }
}

建造者模式的优缺点

优点

缺点

建造者模式与其他设计模式的比较

与工厂模式的区别

与抽象工厂模式的区别

实际应用案例

案例1:构建复杂对象

假设你需要构建一个复杂的文档对象,该对象包含多个部分,如标题、正文、页脚等。使用建造者模式,你可以逐步构建这些部分,并且可以轻松地改变文档的表示。

// 产品类
public class Document
{
    private string _title;
    private string _body;
    private string _footer;

    public void SetTitle(string title)
    {
        _title = title;
    }

    public void SetBody(string body)
    {
        _body = body;
    }

    public void SetFooter(string footer)
    {
        _footer = footer;
    }

    public void Show()
    {
        Console.WriteLine("\nDocument -------");
        Console.WriteLine($"Title: {_title}");
        Console.WriteLine($"Body: {_body}");
        Console.WriteLine($"Footer: {_footer}");
    }
}

// 建造者接口
public interface IDocumentBuilder
{
    void BuildTitle();
    void BuildBody();
    void BuildFooter();
    Document GetResult();
}

// 具体建造者
public class ReportDocumentBuilder : IDocumentBuilder
{
    private Document _document = new Document();

    public void BuildTitle()
    {
        _document.SetTitle("Monthly Report");
    }

    public void BuildBody()
    {
        _document.SetBody("This is the body of the report.");
    }

    public void BuildFooter()
    {
        _document.SetFooter("End of Report");
    }

    public Document GetResult()
    {
        return _document;
    }
}

public class LetterDocumentBuilder : IDocumentBuilder
{
    private Document _document = new Document();

    public void BuildTitle()
    {
        _document.SetTitle("Formal Letter");
    }

    public void BuildBody()
    {
        _document.SetBody("Dear Sir/Madam,");
    }

    public void BuildFooter()
    {
        _document.SetFooter("Yours sincerely, [Your Name]");
    }

    public Document GetResult()
    {
        return _document;
    }
}

// 指挥者
public class DocumentDirector
{
    public void Construct(IDocumentBuilder builder)
    {
        builder.BuildTitle();
        builder.BuildBody();
        builder.BuildFooter();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        DocumentDirector director = new DocumentDirector();

        IDocumentBuilder reportBuilder = new ReportDocumentBuilder();
        director.Construct(reportBuilder);
        Document reportDocument = reportBuilder.GetResult();
        reportDocument.Show();

        IDocumentBuilder letterBuilder = new LetterDocumentBuilder();
        director.Construct(letterBuilder);
        Document letterDocument = letterBuilder.GetResult();
        letterDocument.Show();
    }
}

案例2:构建不可变对象

在某些情况下,你可能希望构建一个不可变对象。使用建造者模式,你可以在对象构造完成后使其不可变。

// 不可变产品类
public class ImmutableProduct
{
    public string PartA { get; }
    public string PartB { get; }

    public ImmutableProduct(string partA, string partB)
    {
        PartA = partA;
        PartB = partB;
    }

    public void Show()
    {
        Console.WriteLine("\nImmutable Product -------");
        Console.WriteLine($"Part A: {PartA}");
        Console.WriteLine($"Part B: {PartB}");
    }
}

// 建造者接口
public interface IImmutableBuilder
{
    void BuildPartA();
    void BuildPartB();
    ImmutableProduct GetResult();
}

// 具体建造者
public class ImmutableConcreteBuilder : IImmutableBuilder
{
    private string _partA;
    private string _partB;

    public void BuildPartA()
    {
        _partA = "Part A";
    }

    public void BuildPartB()
    {
        _partB = "Part B";
    }

    public ImmutableProduct GetResult()
    {
        return new ImmutableProduct(_partA, _partB);
    }
}

// 指挥者
public class ImmutableDirector
{
    public void Construct(IImmutableBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        ImmutableDirector director = new ImmutableDirector();
        IImmutableBuilder builder = new ImmutableConcreteBuilder();

        director.Construct(builder);
        ImmutableProduct product = builder.GetResult();
        product.Show();
    }
}

总结

建造者模式是一种强大的设计模式,特别适用于构建复杂对象。通过将构造过程与表示分离,建造者模式提供了更好的灵活性和控制力。在C#中,建造者模式可以通过定义建造者接口、具体建造者类和指挥者类来实现。通过本文的示例代码,你可以更好地理解如何在C#中使用建造者模式,并将其应用到实际项目中。

参考文献

推荐阅读:
  1. C#设计模式(5)——建造者模式(Builder Pattern)
  2. 如何使用javascript中的建造者模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:如何用C#代码实现封面图片生成器

下一篇:C#中32位浮点数Float实例代码分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》