Java23种设计模式
定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
举例一个:
肯德基食品包含:汉堡(20元)、薯条(12元)、炸鸡翅(16元)、蛋挞(9元)、可乐(10元)
下面有需求,提供套餐的自由组合,并打印出最终价格。
- 创建食品接口(由于需求上只是打印名字和计算价格,那么饮料和食品并没有分开):
public interface Food {
String getName();
int getPrice();
}
- 创建汉堡(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;
}
}
- 创建套餐类(建造者模式核心):
套餐类构造方法对外隐藏,只能通过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);
}
}
}
- 点餐:
public class Test {
public static void main(String[] args) {
Taocan kendeji = new Taocan.Builder()
.setFood(new HanBao())
.setFood(new Kele())
.Build();
kendeji.showDetail();
}
}
- 打印结果:
套餐包含: 汉堡可乐
套餐总价格: 30 元
这里的特点为:
- 每个单品是不变的(汉堡、薯条。。。)
- 构建过程是不确定的(随意组合)
与抽象工厂模式的区别:
- 抽象工厂模式的本质是解决接口调用的分配问题,而建造者模式本质是解决组合的不确定性问题。
- 抽象工厂模式工厂一旦确定,制造的产品是不可变的,而建造者模式根据用户调用不同可以生产出不同产品。