解决对象构建时的混乱困境:使用构建者模式提高代码质量和效率

2023-05-29 23:52:52 浏览数 (1)

大家好,欢迎来到程序视点!

今天,我们一起来分享下一个创建型模式:构建者模式

定义

先来看下它的定义。

建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

小二哥就问大家,看到这个定义懵逼不懵逼?什么叫对象的构建和它的表示分离?

如果你能解释清楚这个问题,那这篇文章后面的内容可以忽略了。

构建者模式简介

我们一起来理解下对象的构建和它的表示分离。先分开来看,一个是对象的构建,另一个是对象的表示

对象的表示,可能不太好理解。让我们换一种问法:怎么表示一个对象? 这个问题大家回答起来是不是就很轻松了?最简单的说法就是:new个东西出来表示对象

对象的构建,就是我们在构建者模式把对象从无变为有的过程。也就是说”构建的最终结果“就是一个对象。

结合起来的意思就是:构建一个对象的过程和该对象最终展示出来要分开

来看看构建者模式包含的角色:

既然是构建者构建对象,那这里面必然包含构建者类和对象类(又可以称为产品类)。

我们提倡面向接口编程,那构建者也就有对应的抽象类(抽象构建者)和实现类(具体构建者)。

还有一个角色是指导者。它调用具体构建者来创建复杂对象。

ps:指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

一起来看下面的例子。

示例

抽象构建者

代码语言:Java复制
public interface ICarBuilder {
    public void buildWheel();
    public void buildSkeleton();
    public void buildEngine();

    Car buildCar();
}

具体构建者

代码语言:Java复制
public class ConcreteBuilder implements ICarBuilder
{
    Car car;

    public ConcreteBuilder()
    {
        car = new Car();
    }

    @Override
    public void buildWheel()
    {
        car.setWheel("轮子");
    }

    @Override
    public void buildSkeleton()
    {
        car.setSkeleton("车身结构");
    }

    @Override
    public void buildEngine()
    {
        car.setEngine("发动机");
    }

    @Override
    public Car buildCar()
    {
        return this.car;
    }

}

产品类

代码语言:Java复制
public class Car {
    private String wheel;
    private String skeleton;
    private String engine;
    
    ...setter & getter
}

指导者

代码语言:Java复制
public class CarDirector {
    public Car constructCar(ICarBuilder builder) {
        builder.buildEngine();
        builder.buildSkeleton();
        builder.buildWheel();
        return builder.buildCar();
    }
}

好了,在测试下:

代码语言:Java复制
public class Test {
    public static void main(String[] args)
    {
        CarDirector director = new CarDirector();
        Car car = director.constructCar(new ConcreteBuilder());
        System.out.println(car.getWheel());
        System.out.println(car.getEngine());
        System.out.println(car.getSkeleton());
    }
}

输出:

<span style="display:block;text-align:left;background-color:grey;color:white;">轮子</span>

<span style="display:block;text-align:left;background-color:grey;color:white;">车身结构</span>

<span style="display:block;text-align:left;background-color:grey;color:white;">发动机</span>

我们最终的得到的Car对象并不是我们自己new出来的,而是ConcreteBuilder这个构建者内部去new的。并且,关于Car对象具体的构建细节我们也不用知道,只需要让ConcreteBuilder这个构建者去

buildEngine(),buildSkeleton(),buildWheel()就好。至于内部是只调用的setter方法,还是其他内容,我们都不用 care。

构建者模式总结

从上面的例子我们可以看出,构建者模式是把建造对象的过程分成一部分一部分来完成的。

她主要是为了将构建复杂对象的过程和它的部件解耦,使得我们不用去关心每个部件是如何组装的,但最终我们能获取到这个对象。

好了,构建者模式就讲到这里了。给大家留个小问题:我们日常工作中碰见过哪些使用构建者模式的情况呢?

期待大家的反馈哦!

0 人点赞