【设计模式】建造者模式

目录

概述

优点

缺点

UML图

示例代码


概述

        建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式使得代码的可维护性和可扩展性都得到了很大的提高。

        建造者模式的核心是一个Builder接口和一个Director类。Builder接口定义了一组抽象方法,用于描述一个复杂对象的构建过程,而Director类负责使用Builder接口来构建这个复杂对象。

        具体的建造者类实现Builder接口,并实现它的抽象方法以构建具有特定行为的对象。而Director类使用Builder接口来构建一个复杂对象,它并不关心具体的建造者类,而是将建造者类的实例传递给Builder接口,由Builder接口负责具体的构建过程。

优点

        建造者模式的优点在于它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。这样可以提高代码的可维护性和可扩展性。此外,建造者模式还可以避免在构建过程中出现不一致的状态,因为所有的变化都是在Builder接口中进行的。

缺点

        建造者模式的缺点在于它会增加代码的复杂度,因为需要定义Builder接口和具体的建造者类。此外,如果一个对象的表示比较简单,那么使用建造者模式可能会显得过于繁琐。

UML图

以下是建造者模式的UML类图:

UML类图中包含以下几个类:

  • Product:表示一个由多个部分组成的复杂对象。
  • IBuilder:定义了一个抽象接口,用于描述一个复杂对象的构建过程。
  • ConcreteBuilder:实现IBuilder接口,用于构建一个具有特定行为的Product对象。
  • Director:使用IBuilder接口来构建一个Product对象,它并不关心具体的建造者类,而是将建造者类的实例传递给Builder接口,由Builder接口负责具体的构建过程。

        在UML类图中,Product类和ConcreteBuilder类之间的关系是聚合关系,表示ConcreteBuilder类构建一个Product对象,并将多个部分聚合到一起。Director类和IBuilder接口之间的关系是依赖关系,表示Director类依赖于IBuilder接口来构建一个Product对象。

示例代码

        下面是一个使用C#语言实现建造者模式的示例代码:首先,我们定义一个Product类,它表示一个复杂对象,包含多个部分。

public class Product
{
    private List<string> _parts = new List<string>();

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

    public void Show()
    {
        Console.WriteLine("Product parts:");
        foreach (string part in _parts)
        {
            Console.WriteLine(part);
        }
    }
}

        

        然后,我们定义一个Builder接口,它包含一组抽象方法,用于描述一个复杂对象的构建过程。

public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    void BuildPartC();
    Product GetResult();
}

        接着,我们定义一个具体的建造者类,它实现Builder接口,并实现它的抽象方法以构建一个具有特定行为的Product对象。

public class ConcreteBuilder : IBuilder
{
    private Product _product = new Product();

    public void BuildPartA()
    {
        _product.Add("PartA");
    }

    public void BuildPartB()
    {
        _product.Add("PartB");
    }

    public void BuildPartC()
    {
        _product.Add("PartC");
    }

    public Product GetResult()
    {
        return _product;
    }
}

        

        最后,我们定义一个Director类,它使用Builder接口来构建一个Product对象。

public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
        builder.BuildPartC();
    }
}

        

        在客户端代码中,我们可以使用Director类和具体的建造者类来构建一个Product对象:

Director director = new Director();
IBuilder builder = new ConcreteBuilder();

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

        

        在这个例子中,Product类表示一个复杂对象,包含多个部分。IBuilder接口描述了Product对象的构建过程,具体的建造者类ConcreteBuilder实现了IBuilder接口,并实现了它的抽象方法以构建一个具有特定行为的Product对象。Director类使用Builder接口来构建一个Product对象,它并不关心具体的建造者类,而是将建造者类的实例传递给Builder接口,由Builder接口负责具体的构建过程。客户端代码只需要调用Director类的Construct方法即可,无需关心具体的对象类型和构建过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值