文章内容
一、什么是建造者模式
建造者模式,将一个复杂对象的构建和它的表示分离,使同样的构建构成可以创建不同的表示。
从定义可以看出,建造者模式适用于一个复杂的对象的建造,而且在建造的过程中,客户端不必知道产品内部组成的细节,实现了构建和装配的解耦。
二、建造者模式角色
- 抽象建造者类(Builder):实现复杂对象的那部分的创建,并不涉及具体的部件对象的创建。
- 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
- 产品类(Product):要创建的复杂对象。
- 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
三、建造者模式UML类图

四、建造者模式优缺点
1、优点
- 封装性好。在使用建造者模式中的场景中,产品类和建造者类是比较稳定的,将主要的业务逻辑封装在指挥者类中。
- 产品创建与产品组装解耦。客户端无需知道产品内部组成的细节。
- 更加精细的控制产品的创建过程。将复杂产品的创建步骤分解到不同的方法中,使得创建过程更加清晰可控。
- 扩展性强。如果新增一个建造者类,不需要修改之前的代码,符合开闭原则。
2、缺点
- 不适合产品之间差异性较大的场景,使用范围受到一定限制。
五、建造者模式demo示例
1、Demo需求
模拟泡红茶:泡红茶分3步,1-向茶壶加水,2-把水烧开,3-加入茶叶,使用建造者模式来实现。
2、代码实现
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | /** * 产品类:茶 */ public class Tea { private String name; public Tea(String name) { this .name = name; } public String getName() { return name; } public void setName(String name) { this .name = name; } } |
1 2 3 4 5 6 7 8 9 | /** * 抽象建造者类 */ public abstract class ITeaBuilder { public abstract void addWater(); public abstract void boilWater(); public abstract void addTea(); public abstract Tea buildTea(); } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * 红茶建造者类 */ public class RedTeaBuilder extends ITeaBuilder { private Tea tea = new Tea( " 红茶 " ); public void boilWater() { System.out.println( "烧开水..." ); } public void addTea() { System.out.println( "加入茶叶..." ); } public void addWater() { System.out.println( "加入热水..." ); } public Tea buildTea() { System.out.println( "红茶泡好了...." ); return tea; } } |
01 02 03 04 05 06 07 08 09 10 11 | /** * 指挥者类:负责泡茶过程顺序 */ public class RedTeaDirector { public Tea createTea(ITeaBuilder teaBuilder) { teaBuilder.boilWater(); teaBuilder.addTea(); teaBuilder.addWater(); return teaBuilder.buildTea(); } } |
3、测试
1 2 3 4 5 6 7 8 | public class Client { public static void main(String[] args) { RedTeaDirector teaDirector = new RedTeaDirector(); Tea redTea = teaDirector.createTea( new RedTeaBuilder()); System.out.println( "==========================" ); } } |