天天看点

【五】Java设计模式GOF23之建造者模式定义:原理类图:使用场景:代码示例

定义:

创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使

得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

原理类图:

【五】Java设计模式GOF23之建造者模式定义:原理类图:使用场景:代码示例

使用场景:

直接点说就是:

1.当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

2.不同的入参品种组装出来的产品表示不一样

代码示例

例子:

之前遇到一个笔试题:星巴克咖啡价格问题:星巴克咖啡有基本的美式,摩卡,拿铁三种,价格都不一样。同时有很多的配料,包括香草、肉桂、奶油、焦糖、巧克力,每种配料的价格也不一样。一种咖啡可以选多种配料。以OOD的方式来计算每杯咖啡的价格。”

目录

【五】Java设计模式GOF23之建造者模式定义:原理类图:使用场景:代码示例

【五】Java设计模式GOF23之建造者模式定义:原理类图:使用场景:代码示例

 这里面client类就是Director,由它来做的组装

package com.sid.builder;

public class Client {
    public static void main(String[] args) {
        EachCupPrice eachCupPrice = new EachCupPrice
                .Builder(new Americano())
                .addBatching(new Vanilla())
                .addBatching(new Chocolate())
                .build();
        System.out.println(eachCupPrice.getPrice());
    }
}
           

没有写专门的Builder接口,是直接在EachCupPrice中写的一个静态内部类Builder

而EachCupPrice就是Product产品

package com.sid.builder;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class EachCupPrice {
    private Coffee coffee;  //必须
    private Set<Batching> batchings;  //可选
    private double price;

    public EachCupPrice(Builder builder) {
        this.coffee = builder.coffee;
        this.batchings = builder.batchings;
        this.price = builder.price;
    }

    public Coffee getCoffee() {
        return coffee;
    }

    public Set<Batching> getBatchings() {
        return batchings;
    }

    public double getPrice() {
        return price;
    }

    public static class Builder {
        private Coffee coffee;  //必须
        private Set<Batching> batchings;  //可选
        private double price;

        public Builder(Coffee coffee) {
            this.coffee = coffee;
            this.batchings = new HashSet();
        }

        public Builder addBatching(Batching batching) {
            this.batchings.add(batching);
            return this;
        }

        public EachCupPrice build() {
            Double batchTotalPrice = batchings.stream().collect(Collectors.summingDouble(x -> ((Batching) x).getPrice()));
            this.price = batchTotalPrice+coffee.getPrice();
            return new EachCupPrice(this);
        }
    }
}