目录
又叫做创建者模式
属于创建型模式
将一个复杂对象,分解为多个简单对象,然后一步步地组装出来。
将变与不变相分离(即产品的组成部分是不变的,但每一部分是可以灵活选择的)。
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
主要优点:
1 封装性好,构建和表示分离。
2 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
3 客户端不必知道产品组成的细节,建造者可以对创建过程逐步细化,而不对其他模式产生任何影响,便于控制细节风险。
缺点:
1 产品的组成部分必须相同, 这限制了其使用范围。
2 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者模式由产品、抽象建造者、具体建造者、指挥者4个要素构成。
1 产品角色 product:包含多个组成部分的复杂对象,由具体建造者来创建其各个零部件。
2 抽象建造者 builder:是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
3 具体建造者Concrete Builder:实现builder接口,完成复杂产品的各个部件的具体建造方法。
4 指挥者director:调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
比如,我们每个人都有不同的长相,人是一个产品。
每个人都长了眼睛、鼻子、嘴巴。
每个人的眼睛、鼻子、嘴巴特点不同,组成的人就是不同的。
代码:
人——产品
- package com.qing.constructor;
-
- public class Person {
- private String eye;
- private String nose;
- private String mouth;
-
- public void setEye(String eye) {
- this.eye = eye;
- }
-
- public void setNose(String nose) {
- this.nose = nose;
- }
-
- public void setMouth(String mouth) {
- this.mouth = mouth;
- }
- public void show(){
- System.out.println("一个"+eye+" "+nose+" "+mouth+"的人");
- }
- }
上帝——抽象建造者
- package com.qing.constructor;
-
- public abstract class God {
- Person person = new Person();
- public abstract void installEye();
- public abstract void installNose();
- public abstract void installMouth();
-
- public Person getResult(){
- return person;
- }
-
- }
具体建造者1
- package com.qing.constructor;
-
- public class Parent1 extends God{
- @Override
- public void installEye() {
- person.setEye("大眼睛、双眼皮");
- }
-
- @Override
- public void installNose() {
- person.setNose("高鼻梁");
- }
-
- @Override
- public void installMouth() {
- person.setMouth("樱桃小嘴");
- }
- }
具体建造者2
- package com.qing.constructor;
-
- public class Parent2 extends God {
- @Override
- public void installEye() {
- person.setEye("小眼睛、单眼皮");
- }
-
- @Override
- public void installNose() {
- person.setNose("大鼻子");
- }
-
- @Override
- public void installMouth() {
- person.setMouth("大嘴巴");
- }
- }
指挥者
- package com.qing.constructor;
-
- public class Director {
- private God god;
-
- public Director(God god) {
- this.god = god;
- }
- public Person install(){
- god.installEye();
- god.installNose();
- god.installMouth();
- return god.getResult();
- }
- }
测试
- package com.qing.constructor;
-
- public class Test1 {
- public static void main(String[] args) {
- God parent1 = new Parent1();
- Director director1 = new Director(parent1);
- director1.install().show();
- System.out.println("----------------------");
- God parent2 = new Parent2();
- Director director2 = new Director(parent2);
- director2.install().show();
- }
- }
结果

建造者模式适用于以下应用场景:
1 相同的方法,不同的执行顺序,产生不同的结果。
2 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
3 产品类非常复杂,或者产品类中,不同的调用顺序,产生不同的结果。
4 初始化一个对象特别复杂,参数,而且很多参数都有默认值。
1 建造者模式和工厂模式的关注点不同。工厂模式只需要把对象创建出来就可以了,而建造者模式,不仅要创建出对象,还要知道对象由哪些部分组成。
2 建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
3 创建简单对象,通常使用工厂模式;创建复杂对象,可以考虑使用建造者模式。
4 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。