Java设计模式之建造者模式

Java23种设计模式

定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

举例一个:

肯德基食品包含:汉堡(20元)、薯条(12元)、炸鸡翅(16元)、蛋挞(9元)、可乐(10元)
下面有需求,提供套餐的自由组合,并打印出最终价格。

  1. 创建食品接口(由于需求上只是打印名字和计算价格,那么饮料和食品并没有分开):
public interface Food {
    String getName();
    int getPrice();
}
  1. 创建汉堡(20元)、薯条(12元)、炸鸡翅(16元)、蛋挞(9元)、可乐(10元)实体类:
public class HanBao implements Food{
    @Override
    public String getName() {
        return "汉堡";
    }

    @Override
    public int getPrice() {
        return 20;
    }
}
public class Shutiao implements Food{
    @Override
    public String getName() {
        return "薯条";
    }

    @Override
    public int getPrice() {
        return 12;
    }
}
public class Zhajichi implements Food{
    @Override
    public String getName() {
        return "炸鸡翅";
    }

    @Override
    public int getPrice() {
        return 16;
    }
}
public class Danta implements Food{
    @Override
    public String getName() {
        return "蛋挞";
    }

    @Override
    public int getPrice() {
        return 9;
    }
}
public class Kele implements Food{
    @Override
    public String getName() {
        return "可乐";
    }

    @Override
    public int getPrice() {
        return 10;
    }
}
  1. 创建套餐类(建造者模式核心):

套餐类构造方法对外隐藏,只能通过builder来创建


public class Taocan {
    private List<Food> list = new ArrayList<>();
    private Taocan(){}
    private Taocan(List<Food> list){
        this.list = list;
    }

    public void showDetail(){
        StringBuffer name = new StringBuffer();
        int price = 0;
        for(Food food:list){
            name.append(food.getName());
            price += food.getPrice();
        }
        System.out.print("套餐包含: "+name.toString()+"\n");
        System.out.print("套餐总价格: "+price+" 元\n");

    }

    public static class Builder{
        private List<Food> list = new ArrayList<>();
        public Builder setFood(Food food){
            list.add(food);
            return this;
        }
        public Taocan Build(){
            return new Taocan(list);
        }
    }

}
  1. 点餐:
public class Test {
    public static void main(String[] args) {
        Taocan kendeji = new Taocan.Builder()
                .setFood(new HanBao())
                .setFood(new Kele())
                .Build();
        kendeji.showDetail();
    }
}
  1. 打印结果:
套餐包含: 汉堡可乐
套餐总价格: 30 元

这里的特点为:

  1. 每个单品是不变的(汉堡、薯条。。。)
  2. 构建过程是不确定的(随意组合)

与抽象工厂模式的区别:

  1. 抽象工厂模式的本质是解决接口调用的分配问题,而建造者模式本质是解决组合的不确定性问题。
  2. 抽象工厂模式工厂一旦确定,制造的产品是不可变的,而建造者模式根据用户调用不同可以生产出不同产品。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值