建造者模式旨在“将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。”它用于逐步构造一个复杂的对象,最后一步将返回该对象。构造对象的过程应该是通用的,以便它可以用于创建同一对象的不同表示。
Builder设计模式的UML图
来源:维基百科
- Product –产品类定义了由构建器模式生成的复杂对象的类型。
- Builder——这个抽象基类定义了正确创建产品必须采取的所有步骤。每个步骤通常都是抽象的,因为构建器的实际功能是在具体的子类中执行的。 GetProduct 方法用于返回最终产品。 builder 类经常被一个简单的接口所取代。
- ConcreteBuilder –可能有任意数量的从 Builder 继承的具体构建器类。这些类包含创建特定复杂产品的功能。
- Director – Director 类控制生成最终产品对象的算法。一个director 对象被实例化并调用它的Construct 方法。该方法包括一个参数,用于捕获将用于生成产品的特定具体构建器对象。然后,director 以正确的顺序调用具体构建器的方法来生成产品对象。该过程完成后,可使用构建器对象的 GetProduct 方法返回产品。
让我们看一个构建器设计模式的例子:
考虑建造房屋。家是作为建造过程的输出而返回的最终成品(对象)。它将有许多步骤,如地下室施工,墙壁施工等屋顶施工。最后返回整个 home 对象。在这里,您可以使用相同的过程建造具有不同属性的房屋。
interface HousePlan
{
public void setBasement(String basement);
public void setStructure(String structure);
public void setRoof(String roof);
public void setInterior(String interior);
}
class House implements HousePlan
{
private String basement;
private String structure;
private String roof;
private String interior;
public void setBasement(String basement)
{
this.basement = basement;
}
public void setStructure(String structure)
{
this.structure = structure;
}
public void setRoof(String roof)
{
this.roof = roof;
}
public void setInterior(String interior)
{
this.interior = interior;
}
}
interface HouseBuilder
{
public void buildBasement();
public void buildStructure();
public void bulidRoof();
public void buildInterior();
public House getHouse();
}
class IglooHouseBuilder implements HouseBuilder
{
private House house;
public IglooHouseBuilder()
{
this.house = new House();
}
public void buildBasement()
{
house.setBasement("Ice Bars");
}
public void buildStructure()
{
house.setStructure("Ice Blocks");
}
public void buildInterior()
{
house.setInterior("Ice Carvings");
}
public void bulidRoof()
{
house.setRoof("Ice Dome");
}
public House getHouse()
{
return this.house;
}
}
class TipiHouseBuilder implements HouseBuilder
{
private House house;
public TipiHouseBuilder()
{
this.house = new House();
}
public void buildBasement()
{
house.setBasement("Wooden Poles");
}
public void buildStructure()
{
house.setStructure("Wood and Ice");
}
public void buildInterior()
{
house.setInterior("Fire Wood");
}
public void bulidRoof()
{
house.setRoof("Wood, caribou and seal skins");
}
public House getHouse()
{
return this.house;
}
}
class CivilEngineer
{
private HouseBuilder houseBuilder;
public CivilEngineer(HouseBuilder houseBuilder)
{
this.houseBuilder = houseBuilder;
}
public House getHouse()
{
return this.houseBuilder.getHouse();
}
public void constructHouse()
{
this.houseBuilder.buildBasement();
this.houseBuilder.buildStructure();
this.houseBuilder.bulidRoof();
this.houseBuilder.buildInterior();
}
}
class Builder
{
public static void main(String[] args)
{
HouseBuilder iglooBuilder = new IglooHouseBuilder();
CivilEngineer engineer = new CivilEngineer(iglooBuilder);
engineer.constructHouse();
House house = engineer.getHouse();
System.out.println("Builder constructed: "+ house);
}
}
输出 :
Builder constructed: House@6d06d69c
Builder设计模式的优点
- 构造函数的参数被减少并以高度可读的方法调用提供。
- Builder 设计模式还有助于最大限度地减少构造函数中的参数数量,因此无需将可选参数的 null 传递给构造函数。
- 对象总是以完整状态被实例化
- 在对象构建过程中无需太多复杂逻辑即可构建不可变对象。
Builder 设计模式的缺点
- 在构建器模式中,代码行数至少增加了一倍,但在设计灵活性和更易读的代码方面付出的努力是有回报的。
- 需要为每种不同类型的产品创建一个单独的 ConcreteBuilder。