设计模式-建造者模式

建造者模式

意图

  • 建造者模式又被称为生成器模式,主要的意图就是能够使使用者一步一步的构建出完整的产品, 允许抽象缓冲层的存在,实现了产品和产品生产过程的解耦。

建造者模式角色

建造者模式角色分类主要有四类:

image.png

  • 产品(Product):是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
  • 建造者(Concrete Builders):提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
  • 抽象建造者(Builder):接口声明在所有类型生成器中通用的产品构造步骤。
  • 指挥者(Director):类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。

– 客户端(Client):需要使用到产品的一端

示例

  1. 目的:使用建造者模式建造一个房子
  2. 分析角色: 首先房子就是属于我们的一种产品(Product),我们需要构建出一个抽象建造者(Builder)来定义构建房子的一些抽象方法, 在构建出具体的建造者(Concrete Builders) 来实现抽象建造者定义的抽象方法, 由指挥者来决定是否生产构建。

类图

image.png

代码实现

House.java

/**
 * @ClassName: House
 * @Description: House -> 产品
 * @Author: a3818
 * @Date: 2021/6/3 11:05
 * @Version 1.0
 * @Copyright
 **/
@Data
public class House {
    /**
     * House的一些属性特征
     */
    /**
     * 颜色
     */
    private String color;
    /**
     * 钢筋
     */
    private String rebar;
    /**
     * 房子大小
     */
    private String length;
    /**
     * 房子宽度
     */
    private String width;

    /**
     * 定义具体建造者
     * @return
     */
    public static AbstractHouseBuilder build(){
        // 注意:生产者必须不同才能生产出不同的产品
        AbstractHouseBuilder abstractHouseBuilder =  new HouseBuilder();
        abstractHouseBuilder.setHouse(new House());
        return abstractHouseBuilder;
    }

}
复制代码

AbstractHouseBuilder.java

/**
 * @ClassName: AbstractHouseBudier
 * @Description: AbstractHouseBuilder -> 抽象生产者
 * @Author: a3818
 * @Date: 2021/6/3 11:09
 * @Version 1.0
 * @Copyright
 **/
@Data
public abstract class AbstractHouseBuilder {
    /**
     * 生产对象
     */
    protected House house = null;

    /**
     * 定义抽象方法,返回AbstractHouseBuilder对象
     */
    public abstract AbstractHouseBuilder color(String col);
    public abstract AbstractHouseBuilder rebar(String reb);
    public abstract AbstractHouseBuilder length(String len);
    public abstract AbstractHouseBuilder width(String wid);


}

复制代码

HouseBuilder.java


/**
 * @ClassName: HouseBuild
 * @Description: HouseBuild -> 建造者
 * @Author: a3818
 * @Date: 2021/6/3 11:33
 * @Version 1.0
 * @Copyright
 **/
public class HouseBuilder extends AbstractHouseBuilder{

    @Override
    public AbstractHouseBuilder color(String col) {
        house.setColor(col);
        return this;
    }

    @Override
    public AbstractHouseBuilder rebar(String reb) {
        house.setRebar(reb);
        return this;
    }

    @Override
    public AbstractHouseBuilder length(String len) {
        house.setLength(len);
        return this;
    }

    @Override
    public AbstractHouseBuilder width(String wid) {
        house.setWidth(wid);
        return this;
    }
}
复制代码

HouseBuild.java

/**
 * @ClassName: HouseBuilder
 * @Description: HouseBuilder -> 指挥者
 * @Author: a3818
 * @Date: 2021/6/3 11:10
 * @Version 1.0
 * @Copyright
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HouseBuild {
    private AbstractHouseBuilder abstractHouseBuilder;
}

复制代码

Client.java


/**
 * @ClassName: Client
 * @Description: client -> 客户端
 * @Author: a3818
 * @Date: 2021/6/3 13:59
 * @Version 1.0
 * @Copyright
 **/
public class Client {

    public static void main(String[] args) {
        AbstractHouseBuilder color = House.build().width("10米").rebar("钢筋水泥").length("10米").color("白色");
        AbstractHouseBuilder color2 = House.build().width("15米").rebar("水泥钢筋").length("15米").color("粉色");
        System.out.println(color.house);
        System.out.println(color2.house);
    }
}

复制代码

测试结果

House(color=白色, rebar=钢筋水泥, length=10米, width=10米)
House(color=粉色, rebar=水泥钢筋, length=15米, width=15米)
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享