📜  建造者设计模式

📅  最后修改于: 2021-09-10 02:50:12             🧑  作者: Mango

建造者模式旨在“将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。”它用于逐步构造一个复杂的对象,最后一步将返回该对象。构造对象的过程应该是通用的,以便它可以用于创建同一对象的不同表示。

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。