建造模式(Builder)

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

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

其实建造者模式在项目中经常能够看到,比如在Android中我们使用AlertDialog的时候。如下:

建造模式(Builder)

类似的还有很多的库都使用了这种建造者模式,可以见的学习这种模式的必要性了。建造模式的类UML类图如下:

建造模式(Builder)

构建模式涉及到的角色如下:

  • 抽象构建角色(Builder):给出一个抽象接口,规范产品对象的各个组成成分的构建。在Java中使用接口或者抽象类进行担任,如果抽象构建角色中包含一些其他的业务代码,则推荐使用抽象类。

  • 具体构建角色(ConcreteBuilder):抽象构建角色的具体实现,该角色实现了抽象构建角色声明的接口方法且提供产品的实例。

  • 产品角色(Product):产品是构造中的复杂对象(因为需要构建角色创建多个方法才能进行创建),一般来说,一个系统中会多于一个的产品类。

  • 导演者角色(Director):该角色使用具体建造角色创建产品对象。主要目的是将产品的创建过程进行封装,一个产品创建的过程可能非常复杂,如果不进行封装,则在每次创建不同的产品时,均要重复编写创建产品过程的复杂代码。

实例:我们以创建一辆车为例,车由车牌、颜色和车标组成,下面通过构建模式来创建车辆,可以创建不同种类的车,如:宝马、奔驰、兰博基尼等等。涉及的类如下:

  • Car:车辆产品

  • Builder:抽象构建器

  • CarBuilder:车辆的具体构建器

  • Director:导演角色,将Builder传递到该类,然后构建车辆的生成过程,客户端使用该类来生产车辆产品。

Java代码如下:

public class SimpleBuilder {
         public static void main(String[] args) {
                   Builder builder = new CarBuilder();
                   Director director = new Director(builder);
                   director.construct("red", "A88888", "Ferrari");
                   System.out.println(builder.build().toString());
         }
}
 
/**
 * 产品(车子)
 */
class Car {
         private String color;
         private String licensePlate;
         private String brand;
 
         public void setColor(String color) {
                   this.color = color;
         }
 
         public void setLicensePlate(String licensePlate) {
                   this.licensePlate = licensePlate;
         }
 
         public void setBrand(String brand) {
                   this.brand = brand;
         }
 
         @Override
         public String toString() {
                   return "Car{" + "color='" + color + '\'' + ", licensePlate='"
                                     + licensePlate + '\'' + ", brand='" + brand + '\'' + '}';
         }
}
 
/**
 * 抽象构建角色(汽车厂规范)
 */
interface Builder {
         // 构建车的颜色
         void buildColor(String color);
 
         // 构建车的车牌
         void buildLicensePlate(String licensePlate);
 
         // 构建车的商标
         void buildBrand(String brand);
 
         // 构建完成最终的汽车
         Car build();
}
 
/**
 * 具体汽车厂
 */
class CarBuilder implements Builder {
         private Car car;
 
         public CarBuilder() {
                   this.car = new Car();
         }
 
         @Override
         public void buildColor(String color) {
                   car.setColor(color);
         }
 
         @Override
         public void buildLicensePlate(String licensePlate) {
                   car.setLicensePlate(licensePlate);
         }
 
         @Override
         public void buildBrand(String brand) {
                   car.setBrand(brand);
         }
 
         @Override
         public Car build() {
                   return car;
         }
}
 
/**
 * 导演角色,利用实际汽车厂生产汽车
 */
class Director {
         private Builder builder;
 
         public Director(Builder builder) {
                   this.builder = builder;
         }
 
         public void construct(String color, String licensePlate, String brand) {
                   // 车辆生产过程(可能非常复杂)
                   builder.buildColor(color);
                   builder.buildLicensePlate(licensePlate);
                   builder.buildBrand(brand);
         }
}
业精于勤,荒于嬉。——韩愈《进学解》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号