设计模式(四)建造者模式

定义:

  建造者模式或者生成器模式(Builder),是由GoF提出的23种设计模式中的一种。
  Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

结构:

建造者模式结构图

应用场景

  • 对象的创建:Builder模式是为对象的创建而设计的模式。

  • 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象。

  • 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法。

举例

  • 有这么一个普通的House类,一般情况下我们会让客户直接new出一个对象,然后再通过set属性的方法进行造房子,但这样会把所有实现的细节全都暴露给客户,由客户对房子进行修饰,这样会有一个问题,有时候我们并不想让实现细节暴露出来,因此,就要引入了建造者模式。

    /房子对象/
    public class House {
    // 地板
    private String floor;
    // 墙
    private String wall;
    // 屋顶
    private String housetop;

    public String getFloor() {
    return floor;
    }

    public void setFloor(String floor) {
    this.floor = floor;
    }

    public String getWall() {
    return wall;
    }

    public void setWall(String wall) {
    this.wall = wall;
    }

    public String getHousetop() {
    return housetop;
    }

    public void setHousetop(String housetop) {
    this.housetop = housetop;
    }

    }

    //客户直接造房子
    House house = new House();
    house.setFloor("地板");
    house.setWall("墙");
    house.setHousetop("屋顶");

  • 使用建造者模式对对象进行装饰:

    • Concrete对象:抽象的工程队,可以完成一系列的操作。

      /* 工程队*/
      public interface HouseBuilder {
      // 修地板
      public void makeFloor();

      // 修墙
      public void makeWall();

      // 修屋顶
      public void makeHousetop();

      // 获取对象
      public House getHouse();
      }

    • Builder:

      /公寓工程队/
      public class GongyuBuilder implements HouseBuilder{
      House house = new House();

      public House getHouse() {
      return house;
      }

      public void makeFloor() {
      house.setFloor("公寓-->地板");
      }

      public void makeHousetop() {
      house.setHousetop("公寓-->房顶");
      }

      public void makeWall() {
      house.setWall("公寓-->墙");
      }

      }

      /平房工程队/

      public class PingFangBuilder implements HouseBuilder {
      House house = new House();

      public void makeFloor() {
      house.setFloor("平房-->地板");
      }

      public void makeHousetop() {
      house.setHousetop("平房-->房顶");
      }

      public void makeWall() {
      house.setWall("平房-->墙");
      }

      public House getHouse() {
      return house;
      }

      }

    • Director:设计者,对屋子进行构建。

      public class HouseDirector {

      public void makeHouse(HouseBuilder builder) {
      builder.makeFloor();
      builder.makeWall();
      builder.makeHousetop();
      }

      }

    • MainClass:

      public class MainClass {

      public static void main(String[] args) {

      // 设计者来设计屋子
      HouseDirector director = new HouseDirector();
      // 由工程队来修
      HouseBuilder builder = new PingFangBuilder();
      // HouseBuilder builder = new GongyuBuilder();
      director.makeHouse(builder);

      House house = builder.getHouse();
      System.out.println(house.getFloor());
      System.out.println(house.getWall());
      System.out.println(house.getHousetop());
      }

      }

在Main方法中可以看到,在构建对象的时候,客户不需要对数据进行细节操作,只需要创建出工程队和设计者,设计者会将所有操作交给工程队来做,我们只需要一个想要实现的工程队即可,它会给我们创建出相应的对象。

posted @ 2017-09-21 09:34  esileme  阅读(149)  评论(0)    收藏  举报