建造者模式

什么是建造者模式?

建造者模式也是创建型模式的一种,它将复杂对象的创建分离,使用者只需要知道复杂对象的类型就可以得到该对象,而无需知道内部的具体构造细节。如:汽车,包括诸多部件:方向盘、发动机、轮胎等,建造者模式的工作便是如何一步步创建对象的各个部件并最终组装成完整的对象。

建造者模式的结构

image.png

  1. Builder(抽象建造者):为创建一个复杂对象的各个部件指定抽象接口,一般包含BuildPartX和GetResult两个方法,前者用来创建复杂对象的各个组成部件,后者用于返回复杂对象,该类既可以是抽象类,也可以是接口。
  2. SpecificBuilder(具体建造者):该类实现了Builder的接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象。
  3. Product(复杂对象):被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的组装过程。
  4. Director(指挥者):负责实现复杂对象的建造顺序,使用者一般只需要与该类进行交互,在知道具体建造者类型并实例化具体建造者对象,然后注入到指挥者类中即可。

建造者模式的实现

  1. 产品对象
//角色类(充当产品对象)
class Role
{
    private string m_Name;
    public string Name
    {
        get { return this.m_Name; }
        set { this.m_Name = value; }
    }

    private string m_Sex;
    public string Sex
    {
        get { return this.m_Sex; }
        set { this.m_Sex = value; }
    }
}
  1. 抽象建造类
//抽象角色建造类
abstract class RoleBuilder
{
    protected Role m_Role = new Role();

    public abstract void BuildName();
    public abstract void BuildSex();

    public Role CreateRole()
    {
        return this.m_Role;
    }
}
  1. 具体建造者
//具体建造者
class Role1Builder : RoleBuilder
{
    public override void BuildName()
    {
        base.m_Role.Name = "Role1";
    }

    public override void BuildSex()
    {
        base.m_Role.Sex = "男";
    }
}

class Role2Builder : RoleBuilder
{
    public override void BuildName()
    {
        base.m_Role.Name = "Role2";
    }

    public override void BuildSex()
    {
        base.m_Role.Sex = "女";
    }
}
  1. 指挥者
//指挥者
class RoleController
{
    //构建复杂对象
    public Role Construct(RoleBuilder builder)
    {
        builder.BuildName();
        builder.BuildSex();
        return builder.CreateRole();
    }
}
  1. 测试
static void Main()
{
    //测试
    var roleController = new RoleController();
    var builder = new Role1Builder();
    var role = roleController.Construct(builder);
    Console.WriteLine($"姓名:{role.Name}, 性别:{role.Sex}");
    Console.ReadKey();
}
  1. 结果
    image.png

钩子方法

通过引入钩子方法可以更加精细地控制产品的创建过程,修改后的代码:

abstract class RoleBuilder
{
    //添加钩子方法,角色是否有名字
    public bool isHasName()
    {
        return true;
    }
}

class RoleController
{
    //构建复杂对象
    public Role Construct(RoleBuilder builder)
    {
        //通过钩子方法控制产品的构建
        if (builder.isHasName())
            builder.BuildName();
        builder.BuildSex();
        return builder.CreateRole();
    }
}

建造者模式的优点

可以更加精细的控制产品的构建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,同时符合开闭原则,易扩展。

建造者模式的缺点

建造者模式的产品需要具有较多的共同点,其组成部分相似,如果产品差异太大,则不适用建造者模式,因此适用范围受到一定的限制;如果产品变化过于复杂,需要定义很多具体建造者来满足这种变化,则会使系统变得更加庞大,增加复杂度。

什么时候使用建造者模式?

  • 目标对象具有复杂的内部结构,这些对象通常包含多个成员变量。
  • 目标对象的属性相互依赖,需要指定其生成顺序。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程得到不同的对象。
7 声望
3 粉丝
0 条评论
推荐阅读
装饰模式
装饰模式可以在不改变已有对象本身的功能的基础上给对象增加额外的新职责,好比日常生活中的照片,可以给照片使用相框,使之具有防潮的功能,但是这样并没有改变照片本身,这便是装饰模式。

DoubleJ阅读 777

工作中常用的设计模式--享元模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe2344阅读 972

封面图
面试的时候别再说你不会设计模式了
最近在设计一个对某个中间件的测试方案,这个测试方案需要包含不同的测试逻辑,但相同的是需要对各个环节进行记录;比如统计耗时、调用通知 API 等相同的逻辑。

crossoverJie阅读 1k

设计模式那些事(4)——常见结构型模式在Go中的应用
上一篇创建型(单例/工厂/建造者)设计模式在Go中的应用介绍了一些常见的创建型设计模式,创建型主要解决了类的创建问题,使代码更易用,而我们经常遇到另外一种问题:类或对象如何组合在一起效率更高,结构型模...

爆裂Gopher1阅读 610评论 1

封面图
设计模式那些事(3)——使用建造者模式封装go的http库
{代码...} 具体实现 {代码...} 使用 {代码...}

爆裂Gopher1阅读 768

封面图
工作中常用的设计模式--适配器模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe234阅读 997

封面图
工作中常用的设计模式--责任链模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe234阅读 912

封面图
7 声望
3 粉丝
宣传栏