🔥 核心
通过建造器,使用多个简单的对象一步一步构造出一个复杂的对象。
🙁 问题场景
你现在从一名程序开发者转行为了一名房屋建筑师。你的任务就是建房子。
你很快建好了一个 房子(House)
。这个房子普普通通,压根不是什么难事儿。很快,你收到了越来越多的订单,房子好像愈加复杂了起来:
一个 带花园的房子(HouseWithGarden)
…
一个 带车库的房子(HouseWithGarage)
…
一个 带泳池的房子(HouseWithSwimmingPool)
…
一个 带火箭基地的的房子(HouseWithRocketBase)
…
一个 既带花园又带泳池的房子(HouseWithGardenAndSwimmingPool)
…
一个 既带车库又带泳池又带火箭基地的房子(HouseWithGardenAndSwimmingPoolAndRocketBase)
…
于是,你以 房子
为基类 ,派生出所有各种各样的房子的子类…等等,房子的种类实在是太多了,为每一种房子创建一个子类显然是愚蠢的行为。
你立即发现了所谓房子的本质——无非是 房子本身
、花园
、车库
、泳池
、火箭基地
的组合。所以,你可以使用一个包含所有可能参数的超级构造函数。使用超级构造函数后,的确避免了生成子类,但是这使得对于构造函数的调用十分不简洁:
new House(3, 2, 4, true, false, true, true, true, false, false, true, false, false, true, true, false);
还有什么其他的注意吗?
🙂 解决方案
你突然意识到,对于这种复杂对象的构造,是不可能一步到位的。
也就是说,必须使用多个简单的对象一步一步构造出一个复杂的对象。复杂对象的整个构造过程,被拆分为一个个小步骤,然后在建造器中调用一个个小步骤。
很快,你写好了以下的小步骤:
建造花园;
建造车库;
建造泳池;
建造火箭基地…
对于 既带花园又带泳池的房子
,就可以调用 建造花园 + 建造泳池。
对于 既带车库又带泳池又带火箭基地的房子
,就可以调用 建造车库 + 建造车库 + 建造火箭基地。
对于一种房子,你仅仅需要调用它需要的一组步骤即可!
🌈 有趣的例子
建造者模式随处可见。在餐厅里,有许多食物(蛋糕(Cake)
、牛肉(Beef)
)和饮品(咖啡(Coffee)
、红酒(Redwine)
)。它们都继承了 单品(Item)
接口。
餐厅提供了多种 套餐(Meal)
。使用建造器,就能组合出这些套餐:
1)蛋糕
+ 咖啡
2)牛肉
+ 红酒
单品接口
interface Item {
String getName();
int getPrice();
}
蛋糕类
class Cake implements Item {
@Override
public String getName() {
return "我是一块蛋糕";
}
@Override
public int getPrice() {
return