【五】Java设计模式GOF23之建造者模式

定义:

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

原理类图:

使用场景:

直接点说就是:

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

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

代码示例

例子:

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

目录

 

 这里面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);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值