什么是建造者模式?
建造者模式是一种创建行为模式,为了是创建对象而存在的设计模式,当对象是由多个简单对象组合而成,且对象组合不断变化的时候,这个对象的创建可以考虑使用建造者模式。
什么时候使用?
对象由多个简单对象组合而成,且对象的组合不断变化的时候。 例如汉堡、可乐可以看做成简单的对象,套餐是我们要创建的对象,套餐包含的对象的种类是不断变化的,套餐的创建就适合使用建造者模式。
有什么缺点?
1,建造者模式构建对象中的简单对象必须有公共的特点(继承自同一接口),使用范围有限。
2,内部逻辑复杂,增加了代码的层级
建造者实现:
以网上的餐厅套餐组合为例,一个套餐由汉堡和饮料组合而成。
首先要实现这个需求,我们要有个套餐类,这个类可以准备不同套餐,这个类也是实现建造者的关键。
public class MealBulider {
public Meal prepareVegMeal(){
Meal meal = new Meal();
meal.addItem(“一种汉堡”);
meal.addItem(“一种可乐”);
return meal;
}
public Meal prepareChickMeal(){
Meal meal = new Meal();
meal.addItem(“另一种汉堡”);
meal.addItem(“另一种可乐”);
return meal;
}
}
这个类就是我们说的创建者,这个准备套餐就很容易了,不断的向Item中加产品(简单对象)就可以了, 然后想想如何创建Meal这个类呢? meal中必包含一个产品的List,用于保存汉堡,可乐等等信息,有一个添加产品的方法。
public class Meal {
private List<Item> foodList = new ArrayList<>();
public void addItem(Item item){
foodList.add(item);
}
}
然后如果汉堡和可乐都能作为一个对象添加到Item中,那么很容易知道,这两个类必须都继承同一个Item接口。【建造者缺点之一】
interface Item(){}
一种汉堡 implements Item(){}
另外一种汉堡 implements Item(){}
一种可乐 implements Item(){}
另外一种可乐 implements Item(){}
以上,我们就完成了一个简单的建造者模式。
public class Client {
public static void main(String[] args){
MealBulider bulider = new MealBulider();
Meal meal = bulider.prepareChickMeal();
Meal meal1 = bulider.prepareVegMeal();
}
}
这样 meal中就有了我们需要的组合,当然 我们可以根据需求对简单对象层进行拆分,提取和优化。
现在,如果有第三种套餐,两份可乐的怎么做呢?很简单,在MealBulider中添加一个方法就可以获取这个套餐对象了。