建造者模式——NWU_LK

建造者模式

基本概念

又叫生成器模式,是一种对象构建模式,它可以将复杂对象的创建过程抽取出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。Builder模式可以将一个类的构建和表示进行分离。

建造者模式的四个要素:

  • 产品类(Product):一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
  • 抽象建造者(Builder):引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者(ConcreteBuilder):实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
  • 导演类(Director):负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
    在这里插入图片描述
  1. 指挥者(Director)直接和客户(Client)进行需求沟通;
  2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
  3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
  4. 各个具体建造者负责进行产品部件的构建;
  5. 最终构建成具体产品(Product)。
实例分析

该示例是 Builder模式的常规用法,导演类 Director 在 Builder模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。

  • 创建产品类
class House{
    private String basic;
    private String wall;
    private String roof;
    public String getBasic() {
        return basic;
    }
    public void setBasic(String basic) {
        this.basic = basic;
    }
    public String getWall() {
        return wall;
    }
    public void setWall(String wall) {
        this.wall = wall;
    }
    public String getRoof() {
        return roof;
    }
    public void setRoof(String roof) {
        this.roof = roof;
    }
}
  • 创建Builder抽象类
abstract class HouseBuilder{
    protected House house=new House();
    public abstract void buildBasic();
    public abstract void buildWall();
    public abstract void buildRoof();
    public House createHouse(){
        return house;
    };
}
  • 创建平房Builder类和高楼Builder类
class CommonHouseBuilder extends HouseBuilder{
    @Override
    public void buildBasic() {
        house.setBasic("平房地基");
    }
    @Override
    public void buildWall() {
        house.setWall("平房墙");
    }
    @Override
    public void buildRoof() {
        house.setRoof("平房屋顶");
    }
}
class HighHouseBuilder extends HouseBuilder{
    @Override
    public void buildBasic() {
        house.setBasic("高楼地基");
    }
    @Override
    public void buildWall() {
        house.setWall("高楼墙");
    }
    @Override
    public void buildRoof() {
        house.setRoof("高楼屋顶");
    }
}
  • 创建HouseDirector类
class HouseDirector {
    private HouseBuilder houseBuilder;
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder=houseBuilder;
    }
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        return houseBuilder.createHouse();
    }
}
  • 客户端利用HouseDirector构建房子
public void test(){
        HouseDirector houseDirector=new HouseDirector(new HighHouseBuilder());
        House house = houseDirector.constructHouse();
        System.out.println(house.getBasic());
    }
建造者模式优缺点分析
  • 优点
  1. 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  3. 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
  • 缺点
  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
与工厂模式对比

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

JAVA中的使用

StringBuilder用到了建造者模式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值