设计模式之建造者模式

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之建造者模式相关的知识,希望对你有一定的参考价值。

1.简要概述

  • 建造者模式也可以叫做生成器模式。
  • 建造者模式就是说首先封装一个对象的构造过程,然后按照这个过程步骤去构建这个对象实例。
  • 建造者模式的本质就是分离了对象子组件的单独构建和装配过程,从而可以构造出更加复杂的对象。复杂对象就好比一部有待建造的手机,而对象中的属性就好比手机中的各个部件,所以建造对象的过程就好比是手机部件相互组合建造手机的过程。
  • 对于复杂对象而言,它们的创建过程很复杂,因此我们想把这些过程单独的抽离开来封装到一个类中,而不是让客户端去直接处理其中的细节。建造者模式可以将这些创建的过程分割开来,按照某种指定步骤去创建复杂的对象,客户端只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
  • 建造者模式将一个复杂对象的构建与它的表示进行了解耦,使得同样的构建过程可以创建不同的表示。也就是说不同的构建器,相同的装配,可以做出不同的对象。相同的构建器,不同的装配顺序,也可以做出不同的对象,实现了更好的复用。
  • 建造者模式中,我们引入了一个指挥者类,使用该类的好处:
    • 一方面使客户端与具体生产过程进行了解耦,客户端只需要知道具体建造者的类型。
    • 一方面指挥者只负责控制产品的生成过程,针对的是建造者接口,即可以通过指挥者类调用建造者的相关方法来返回一个完整的对象。

2.模式结构

👉通常由一个建造者接口( 负责定义创建复杂产品对象的步骤 ),多个具体的建造者实现类( 负责实现创建复杂产品对象的步骤内部逻辑 ),一个指挥者类( 负责定义创建相应产品对象的组装方法 ),一个具体的产品对象、一个客户类( 负责调用来获取指定复杂对象 )共同组成。

3.实现代码

举例 💡 :假设一个房子的构建流程分为打地基、砌墙、盖顶三步,而对于不同的房子类型它们的各步骤实现细节是不一样的,那么这个搭建不同房子的过程我们就可以采用建造者模式来实现。

房子对象类

public class House{
    private String foundation;
    private String wall;
    private String roof;
    
    // get和set方法
    ...
}

房子建造者抽象类

public abstract class HouseBuilder {
    public abstract void buildFoundation();
    public abstract void buildWall();
    public abstract void buildRoof();

    public abstract House getHouse();
}

低房子建造实现类

public class LowHouseBuilder extends HouseBuilder{
    
    private House house = new House();
    
    @Override
    public abstract void buildFoundation(){
        house.setFoundation("给低房子打地基");
    }
    
    @Override
    public abstract void buildWall(){
        house.setWall("给低房子砌墙");
    }
    
    @Override
    public abstract void buildRoof(){
        house.setRoof("给低房子盖顶");
    }
    
	@Override
    public abstract House getHouse(){
        return house
    }
}

高房子建造实现类

public class HighHouseBuilder extends HouseBuilder{
    
    private House house = new House();
    
    @Override
    public abstract void buildFoundation(){
        house.setFoundation("给高房子打地基");
    }
    
    @Override
    public abstract void buildWall(){
        house.setWall("给高房子砌墙");
    }
    
    @Override
    public abstract void buildRoof(){
        house.setRoof("给高房子盖顶");
    }
    
	@Override
    public abstract House getHouse(){
        return house
    }
}

房子建造指挥类

public class HouseDirector {

    private HouseBuilder houseBuilder;
    
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    
    public House buildHouse(){
        houseBuilder.buildFoundation();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        
        return houseBuilder.getHouse();
    }
}

客户类

// 测试客户端
public class HouseClient{
    public static void main(String[] args) {
        HouseDirector houseDirector1 = new HouseDirector(new LowHouseBuilder());
        House lowHouse = houseDirector.buildHouse();
     	
        HouseDirector houseDirector2 = new HouseDirector(new HighHouseBuilder());
        House highHouse = houseDirector2.buildHouse();
    }
}

4.优点好处

  • 客户端不必知道对象内部的构建细节,将对象本身与对象的创建过程进行了解耦。
  • 相同的创建过程可以创建不同的产品对象,将对象的构建与对象的表示进行了解耦。
  • 每一个具体建造者都相互独立,因此可以很容易的进行扩展,符合OCP原则。

5.缺点弊端

由于建造者模式所创建的对象一般具有较多的共同点,因此使用范围会受到一定的限制,如果对象内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,最终导致系统变得复杂。

6.应用场景

  • 当需要创建的对象有复杂的内部结构,也就是对象的建造涉及许多步骤的时候使用。
  • 当需要创建的对象中的属性具有依赖关系,需要指定其生成顺序时使用。
  • 当需要隔离复杂对象的创建和使用,并想通过相同的创建过程创建不同类型的对象时使用。

7.应用示例

JDK源码中的StringBuilder类

Appendable在这里可以充当建造者接口:

AbstractStringBuilder在这里可以充当具体的建造者实现类:


以上是关于设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式之建造者模式代码实例

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

《设计模式》之建造者模式(Builder)

创建型模式之建造者模式

设计模式之建造者模式

设计模式之建造者模式(builder)