建造者模式

UML图

在这里插入图片描述

建造者模式主要包含四个角色

  • Product:代表最终构建的对象,比如,汽车类。
  • Builder:代表建造者的抽象基类(可以使用接口来代替)。它定义了构建 Product
    的步骤,它的子类(或接口实现类)需要实现这些步骤。同时,它还需要包含一个用来返回最终对象的方法 getProduct()。
  • ConcreteBuilder:代表 Builder 类的具体实现类。
  • Director:代表需要建造最终对象的某种算法。这里通过使用构造函数 Construct(Builder builder) 来调用
    Builder 的创建方法创建对象,等创建完成后,再通过 getProduct() 方法来获取最终的完整对象。

时序图

在这里插入图片描述

原型图对应的实现

/**
 * 产品
 */
public class Product {

    private int partA;

    private String partB;

    private int partC;

    public static Product builder(){
        return new Product();
    }

    public int getPartA() {
        return partA;
    }

    public Product partA(int partA) {
        this.partA = partA;
        return this;
    }

    public String getPartB() {
        return partB;
    }

    public Product partB(String partB) {
        this.partB = partB;
        return this;
    }

    public int getPartC() {
        return partC;
    }

    public Product partC(int partC) {
        this.partC = partC;
        return this;
    }

    public Product build(){
        return this;
    }
}
/**
 * 抽象构建者
 */
public interface Builder {

    void buildA(int partA);

    void buildB(String partB);

    void buildC(int partC);

    Product getResult();

}

/**
 * 具体构建者
 */
public class ConcreteBuilder implements Builder {

    private int partA;

    private String partB;

    private int partC;

    @Override
    public void buildA(int partA) {
        this.partA = partA;
    }

    @Override
    public void buildB(String partB) {
        this.partB = partB;
    }

    @Override
    public void buildC(int partC) {
        this.partC = partC;
    }

    @Override
    public Product getResult() {
        return Product.builder().partA(partA).partB(partB).partC(partC).build();
    }
}
/** 构建执行者
 */
public class Director {

    public void consturct(Builder builder){
        builder.buildA(1);
        builder.buildB("testB");
        builder.buildC(222);
    }
}
// 测试用例
public class Main {

    public static void main(String[] args){
        Builder builder = new ConcreteBuilder();

        Director director = new Director();
        director.consturct(builder);

        System.out.println(builder.getResult());
    }
}

示例1

import lombok.Data;

/**
 * @Description 产品
 */
 @Data
 public class House {
    private String basic;
    private String wall;
    private String roofed;
}
/**
 * @Description 抽象的建造者
 */
public interface HouseBuilder {

    default House initHouse(){
        return new House();
    }

     void buildBasic();

      void buildWall();

     void roofed();

     // 房子好后,返回
     House getResult() ;

}
/**
 * @Description 具体的建造者1
 */
public class CommonHouse implements HouseBuilder {

    private final House house;

    public CommonHouse() {
        this.house = initHouse();
    }

    @Override
    public void buildBasic() {
        this.house.setBasic("普通房子打地基");
    }

    @Override
    public void buildWall() {
        this.house.setWall("普通房子砌墙");
    }

    @Override
    public void roofed() {
        this.house.setRoofed("普通房子封顶");
    }

    @Override
    public House getResult() {
        return house;
    }
}
/**
 * @Description 具体的建造者2
 */
public class HighHouse implements HouseBuilder{

    private House house;

    public HighHouse() {
        this.house = initHouse();
    }

    @Override
    public void buildBasic() {
        house.setBasic("高楼打地基");
    }

    @Override
    public void buildWall() {
          house.setWall("高楼砌墙");
    }

    @Override
    public void roofed() {
          house.setRoofed("高楼封顶" );
    }

    @Override
    public House getResult() {
        return house;
    }
}
/**
 * @Description 建造执行者
 */
public class HouseDirector {

    HouseBuilder houseBuilder = null;

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    /**
     * 处理建造的流程,交给 HouseDirector
     *
     * @return
     */
    public void constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWall();
        houseBuilder.roofed();
    }

}
/**
 * @Description 测试用例
 */
public class Client {

    public static void main(String[] args) {
     HouseDirector director = new HouseDirector();

         // 普通房子
        CommonHouse commonHouse = new CommonHouse();
        director.setHouseBuilder(commonHouse);
        director.constructHouse();
        System.out.println(commonHouse.getResult());

        // 高楼
        HighHouse highHouse = new HighHouse();
        director.setHouseBuilder(highHouse);

        director.constructHouse();
        System.out.println(highHouse.getResult());

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值