设计模式之建造者模式

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在这里可以充当具体的建造者实现类:

请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值