写点什么

设计模式 - 技术专题 - 建造者模式(Builder)

发布于: 2020 年 08 月 20 日
设计模式-技术专题-建造者模式(Builder)

1. 建造者模式简介

  建造者模式主要作用就是将复杂事物创建的过程抽象出来,该抽象的不同实现方式不同,创建出的对象也不同。通俗的讲,创建一个对象一般都会有一个固定的步骤,这个固定的步骤我们把它抽象出来,每个抽象步骤都会有不同的实现方式,不同的实现方式创建出的对象也将不同

  举个例子,汽车包括车轮、方向盘、发送机等各种部件,建造一辆汽车无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是建造完成后使用一辆完整的汽车。

1.1 模式动机

  在软件开发中,也存在大量类似汽车一样的复杂对象,它们拥有一系列成员属性,这些成员属性中有些是引用类型的成员对象。而且在这些复杂对象中,还可能存在一些限制条件,如某些属性没有赋值则复杂对象不能作为一个完整的产品使用;有些属性的赋值必须按照某个顺序,一个属性没有赋值之前,另一个属性可能无法赋值等。

  复杂对象相当于一辆有待建造的汽车,而对象的属性相当于汽车的部件。由于组合部件的过程很复杂,因此,这些部件的组合过程往往被“外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式,这就是建造者模式的模式动机。

1.2 模式特点

  • 创建型模式,主要用于创建对象

  • 意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

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

  • 效果:可以改变一个产品的内部表示。将构造代码和表示代码分开。可以对构造过程进行更精细的控制

1.3 UML图





主要角色:

  • Product:产品角色

  • Builder:抽象建造者

  • ConcreteBuilder:具体建造者

  • Director:指挥者

2. 建造者模式实现

产品类:

public class Car
{
private String partA; //可以是任意类型
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}


建造者接口类:

public interface CarBuilder {
void buildPartA();
void buildPartB();
void buildPartC();
Car getCar();
}


具体建造者类:

public class CarBuilder
{
protected Car car=new Car();
public void buildPartA(){
car.setPartA();
}
public abstract void buildPartB(){
car.setPartB();
}
public abstract void buildPartC(){
car.setPartC();
}
public Car getResult()
{
return car;
}
}


指挥者实现类:

public class Director
{
private Builder builder;
public Director(Builder builder)
{
this.builder=builder;
}
public void setBuilder(Builder builder)
{
this.builder=builer;
}
public Product construct()
{
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}


客户端使用:

Builder builder = new CarBuilder();
Director director = new Director(builder);
Car car = director.construct();


3. 建造者模式变种

建造者模式简化:

  开发中,Director角色会经常被省略。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键点是每个setter方法都返回自身,即return this。



简化后代码:

public class Car
{
private final String partA;
private final String partB;
private final String partC;
private Car(Builder builder){
this.partA = builder.PartA;
this.partB = builder.PartB;
this.partC = builder.PartC;
}

public static class Builder {
private String partA;
private String partB;
private String partC;

public Car build() {
return new Car(this);
}
public Builder partA(String partA) {
this.partA = partA;
return this;
}
public Builder partB(String partB) {
this.partB = partB;
return this;
}
public Builder partC(String partC) {
this.partC = partC;
return this;
}
}
}


客户端使用类:

Car car = new Car.Builder()
.partA("A")
.partB("B")
.partC("C");



用户头像

我们始于迷惘,终于更高的迷惘. 2020.03.25 加入

一个酷爱计算机技术、健身运动、悬疑推理的极客狂人,大力推荐安利Java官方文档:https://docs.oracle.com/javase/specs/index.html

评论

发布
暂无评论
设计模式-技术专题-建造者模式(Builder)