大家好,欢迎来到程序视点!
今天,我们一起来分享下一个创建型模式:构建者模式
。
定义
先来看下它的定义。
建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
小二哥就问大家,看到这个定义懵逼不懵逼?什么叫对象的构建和它的表示分离
?
如果你能解释清楚这个问题,那这篇文章后面的内容可以忽略了。
构建者模式简介
我们一起来理解下对象的构建和它的表示分离
。先分开来看,一个是对象的构建
,另一个是对象的表示
。
对象的表示
,可能不太好理解。让我们换一种问法:怎么表示一个对象? 这个问题大家回答起来是不是就很轻松了?最简单的说法就是: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。
构建者模式总结
从上面的例子我们可以看出,构建者模式是把建造对象的过程分成一部分一部分来完成的。
她主要是为了将构建复杂对象的过程和它的部件解耦,使得我们不用去关心每个部件是如何组装的,但最终我们能获取到这个对象。
好了,构建者模式就讲到这里了。给大家留个小问题:我们日常工作中碰见过哪些使用构建者模式的情况呢?
期待大家的反馈哦!