写在前面:今天被调到了解决方案开发部,感觉比之前好多了,讲真还是开代码比较舒服。希望顺顺利利的吧。
在平时的生活中,有很多复杂的事务,比如汽车是由发动机、方向盘、车座椅等组成,建造大楼是由打地基、建立框架等过程组成。建造者模式就如同盖楼一样,必须保证其流程不变,但每个流程实现的具体细节是经常变化的。
1.what is 建造者模式?
建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
它属于创建型模式,一个Builder类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的。
2.涉及角色
(1) 抽象建造者
给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。通常会有两个抽象方法,一个建造产品,一个返回产品。
(2) 具体建造者
实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
(3) 指挥者
构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
(4) 产品
一个具体的复杂的产品对象
3.建造者模式介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于精确的控制复杂对象的产生过程。3、细节依赖抽象,相同创建过程得到不同的产品。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构,包含多个成员属性。 2、需要生成的对象内部属性本身相互依赖,相同的创建过程可以创建不同的产品。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
4.实现
//产品角色
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
//抽象建造者
public abstract class MealBuilder {
Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal(){
return meal;
}
}
//具体建造者
public class MealA extends MealBuilder{
public void buildDrink() {
meal.setDrink("一杯可乐");
}
public void buildFood() {
meal.setFood("一盒薯条");
}
}
public class MealB extends MealBuilder{
public void buildDrink() {
meal.setDrink("一杯柠檬果汁");
}
public void buildFood() {
meal.setFood("三个鸡翅");
}
}
//指挥官角色
public class KFCWaiter {
private MealBuilder mealBuilder;
public void setMealBuilder(MealBuilder mealBuilder) {
this.mealBuilder = mealBuilder;
}
public Meal construct(){
//准备食物
mealBuilder.buildFood();
//准备饮料
mealBuilder.buildDrink();
//准备完毕,返回一个完整的套餐给客户
return mealBuilder.getMeal();
}
}
//测试
public class Client {
public static void main(String[] args) {
//服务员
KFCWaiter waiter = new KFCWaiter();
//套餐A
MealA a = new MealA();
//服务员准备套餐A
waiter.setMealBuilder(a);
//获得套餐
Meal mealA = waiter.construct();
System.out.println(mealA.getFood()+"---"+mealA.getDrink());
}
}
5.总结
(1) 建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。
(2) 建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。