创建型模式之建造者模式

x33g5p2x  于2022-02-12 转载在 其他  
字(2.3k)|赞(0)|评价(0)|浏览(193)

假如有一个盖房的项目需求

要求

盖房子有个三个步骤,打桩,砌墙,封顶

房子有各种各样的,比如普通房,高楼,别墅

解决方案
①传统方式

将盖房的方法统一封装到一个父类,用子类(普通房,高楼,别墅)去继承盖房

盖房统一父类House.java

public abstract class House{
    //通用的打桩方法
    void abstract buildBasic();
    //通用的砌墙方法
    void abstract buildWalls();
    //通用的封顶方法
    void abstract roofed();
    //通用的建房方法合集
    public void build(){
        buildBasic();
        buildWalls();
        roofed();
    }
}

建造普通房子类CommonHouse.java

public class CommonHouse extends House{
    @Override
    public void buildBasic(){
        sout("普通房子打桩")
    }
    @Override
    public void buildWalls(){
        sout("普通房子砌墙")
    }
    @Override
    public void roofed(){
        sout("普通房子封顶")
    }
}

客户端Client.java

public class Client{
    public static void main(String[] args){
        new CommonHouse().build();
    }
}

问题:

  • 优点比较好理解,简单易操作
  • 设计程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性强。
  • 解决方案:将产品和产品建造过程解耦==》建造者模式
②建造者模式

基本介绍

  • 建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构建出不同表现的对象
  • 建造者模式使一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户需要知道内部的具体构建细节。

建造者模式的四个角色

  • 产品角色:一个具体的产品对象
  • 抽象建造者:创建一个产品对象的各个部件指定的接口/抽象类
  • 具体建造者:实现接口,构建和装配各个部件。
  • 指挥者:构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

建造者模式盖房子类图

House.java

public class House{
    private String baise;
    private String wall;
    private String roofed;
    //省略getter和setter
}

HouseBuilder.java

//抽象的建造者
public abstract class HouseBuilder{
    protected House house=new House();
    //将建造的流程写好,抽象的方法
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abasract void roofed();
    //建造房子后将产品返回
    public House buildHouse(){
        return house;
    }
}

CommonHouse.java

public class CommonHouse extends HouseBuilder{
    @Override
    public void buildBasic(){
        sout("普通房子打地基")
    }
    @Override
    public void buildWalls(){
        sout("普通房子砌墙")
    }
    @Override
    public void roofed(){
        sout("普通房子封顶")
    }
}

HouseDirector.java

public class HouseDirector{
    HouseBuilder houseBuilder=null;
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder=houseBuilder;
    }
    //如何处理建造房子的流程,交给指挥者
    public House constructHouse(){
        houseBuilder.buildbasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}

Client.java

public class Client{
     main{
         CommonHouse commonHouse=new CommonHouse();
         HouseDirector houseDirector=new HouseDirector(commonHouse);
         House house=houseDirector.constructHouse();
     }
 }

适合的应用场景

  • 使用生成器模式可避免**“重叠构造函数telescopic constructor)****”的出现。**
  • 当你希望使用代码创建不同形式的产品**(例如石头或木头房屋,** 可使用生成器模式**。**
  • 使用生成器模式可避免**“重叠构造函数telescopic constructor)****”的出现。**
  • 当你希望使用代码创建不同形式的产品**(例如石头或木头房屋,** 可使用生成器模式**。**
  • 使用生成器构造组合树或其他复杂对象**。**

相关文章