光輝歲月

导航

 

  第一次好好的看设计模式,可能有不对的地方,大佬们可以下面指出,感谢!

  ----------- 分割线 ----------

UML图

找了张网图,自己就不画了。

 

作用

  可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就可以不用知道了。

 

使用场景

1:当复杂对象需要与表示分离,可能需要创建不同的表示时;

2:当需要向客户隐藏产品内部结构的表现时;

 

今天拿开发一款软件产品为例:

首先定义产品类

@Data
public class Product {

    private String proName;//产品名称

    private Date endDate;//产品研发结束时间

    private String demand;//产品需求

    private String model;//产品模型

    private List<String> tables;//产品数据表

    private String ui;//产品ui
}

定义产品的建造器

public abstract class ProductBuilder {

    abstract void buildDemand();

    abstract void buildModel();

    abstract void buildui();

    abstract void buildTables();

    abstract void buildEndDate();

    abstract void showProduct();

}

定义指挥者

public class Dircetor {

    private ProductBuilder productBuilder;

    public Dircetor(ProductBuilder productBuilder) {
        this.productBuilder = productBuilder;
    }

    public void startBuild() {
        productBuilder.buildDemand();
        productBuilder.buildModel();
        productBuilder.buildui();
        productBuilder.buildTables();
        productBuilder.buildEndDate();
    }

}

定义微博产品,实现产品建造器

public class Weibo extends ProductBuilder {

    private Product product;

    public Weibo(){
        this.product = new Product();
        product.setProName("微博");
    }

    @Override
    void buildDemand() {
        System.out.println("开始制定微博需求");
        product.setDemand("微博需求:娱乐民众");
    }

    @Override
    void buildModel() {
        System.out.println("开始制定微博原型");
        product.setModel("这是微博的原型");
    }

    @Override
    void buildui() {
        System.out.println("开始制定微博UI图");
        product.setUi("这是微博的ui图");
    }

    @Override
    void buildTables() {
        System.out.println("开始制定微博数据库表");
        List<String> tables = Arrays.asList(new String[] {"table_a","table_b","table_c"});
        product.setTables(tables);
    }

    @Override
    void buildEndDate() {
        System.out.println("需求分析结束,制定项目研发最终日期");
        product.setEndDate(new Date());
    }

    @Override
    void showProduct() {
        System.out.println(JSON.toJSONString(product));
    }
}

程序调用

public class Main {

    public static void main(String[] args){
        ProductBuilder weiboBuiler = new Weibo();
        Dircetor dircetor = new Dircetor(weiboBuiler);
        dircetor.startBuild();
        System.out.println("------------分割线--------------");
        weiboBuiler.showProduct();
    }

}

控制台输出

开始制定微博需求
开始制定微博原型
开始制定微博UI图
开始制定微博数据库表
需求分析结束,制定项目研发最终日期
------------分割线--------------
Disconnected from the target VM, address: '127.0.0.1:60596', transport: 'socket'
{"demand":"微博需求:娱乐民众","endDate":1564390022604,"model":"这是微博的原型","proName":"微博","tables":["table_a","table_b","table_c"],"ui":"这是微博的ui图"}

Process finished with exit code 0

 

posted on 2019-07-29 16:58  光輝歲月  阅读(196)  评论(1编辑  收藏  举报