建造者模式
标签:设计模式

建造者模式(Builder)

Builder模式是一种对象创建型模式,又叫生成器模式,用来隐藏符合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态的创建具有符合属性的对象。

1. 模式中包含的角色及其职责

1.1 产品(Product)

最后客户端需要获得的产品

Product

package com.liuyao;

import lombok.Data;
import lombok.ToString;

/**
 * @author liuyao
 * @date 2018/07/30
 */
@Data
@ToString
public class House {
    private String floor;
    private String wall;
    private String window;
}

1.2 抽象建造者(Builder)

抽象建造者负责提供建造产品的接口

HouseBuilder

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/30
 */
public interface HouseBuilder {
     public void makeFloor();

     public void makeWall();

     public void makeWindow();

     public House getHouse();
}

1.3 具体建造者(Concrete Builder)

实现抽象建造者的建造接口,根据要建造不同的产品完成不同建造

PingFangBuilder

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/30
 */
public class PingFangBuilder implements HouseBuilder {
    private House house=new House();
    @Override
    public void makeFloor() {
        house.setFloor("PingFang ==> Floor");
    }

    @Override
    public void makeWall() {
        house.setWall("PingFang ==> Wall");
    }

    @Override
    public void makeWindow() {
        house.setWindow("PingFang ==> Window");
    }

    @Override
    public House getHouse() {
        return house;
    }
}

GongYuBuilder

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/30
 */
public class GongYuBuilder implements HouseBuilder {
    private House house=new House();
    @Override
    public void makeFloor() {
        house.setFloor("GongYu ==> Floor");
    }

    @Override
    public void makeWall() {
        house.setWall("GongYu ==> Wall");
    }

    @Override
    public void makeWindow() {
        house.setWindow("GongYu ==> Window");
    }

    @Override
    public House getHouse() {
        return house;
    }
}

1.4 设计者(Director)

调用对不同具体建造的建造方法来建造产品

HouseDirector

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/30
 */
public class HouseDirector {
    public void makeHouse(HouseBuilder houseBuilder){
        houseBuilder.makeFloor();
        houseBuilder.makeWall();
        houseBuilder.makeWindow();
    }
}


Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
//        创建工程队 建造平房
        HouseBuilder pingFangBuilder=new PingFangBuilder();
//        创建设计者
        HouseDirector director=new HouseDirector();
        director.makeHouse(pingFangBuilder);
        House pingFang=pingFangBuilder.getHouse();
        System.out.println(pingFang);

//        建造公寓
        HouseBuilder gongYuBuilder = new GongYuBuilder();
        director.makeHouse(gongYuBuilder);
        House gongYu=gongYuBuilder.getHouse();
        System.out.println(gongYu);
    }
}

2. 应用场景

  1. 创建一个符合对象,被创建的对象为一个具有复合属性的符合对象(我上面这是用了String代替,实际上可以创建由更多的复合属性)
  2. 关注对象创建的各个部分的创建过程,不同的Builder生成器对产品属性有不同的创建方法。
  • 3 min read

CONTRIBUTORS


  • 3 min read