建造者模式
建造者模式(也被成为生成器模式),是⼀种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,
⽽建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义⼀个抽象的接口。具体的构建过程
由实现了这些接口的具体建造者类来完成。同时有⼀个指导者类负责协调建造者的工作,按照⼀定的顺序或逻辑来
执行构建步骤,最终生成产品
建造者(Builder)模式的主要角色如下。
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
例子

产品角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class Actor { private String type; private String sex; private String costume;
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
public String getCostume() { return costume; }
public void setCostume(String costume) { this.costume = costume; } }
|
抽象构造者
1 2 3 4 5 6 7 8 9 10
| public abstract class Builder { Actor actor = new Actor(); public abstract void buildType(); public abstract void buildSex(); public abstract void buildCostume(); public Actor creatActor(){ return actor; } }
|
具体构造者
完成具体产品的构造细节
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class DevilBuilder extends Builder{ @Override public void buildType() { actor.setType("恶魔"); } @Override public void buildSex() { actor.setSex("男"); } @Override public void buildCostume() { actor.setCostume("黑衣"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class HeroBuilder extends Builder{ @Override public void buildType() { actor.setType("英雄"); } @Override public void buildSex() { actor.setSex("男"); } @Override public void buildCostume() { actor.setCostume("盔甲"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class HeroBuilder extends Builder{ @Override public void buildType() { actor.setType("英雄"); } @Override public void buildSex() { actor.setSex("男"); } @Override public void buildCostume() { actor.setCostume("盔甲"); } }
|
指挥者
1 2 3 4 5 6 7 8
| public class ActorController { public Actor construct(Builder builder){ builder.buildType(); builder.buildSex(); builder.buildCostume(); return builder.creatActor(); } }
|
Client
1 2 3 4 5 6 7 8 9
| public class Client { public static void main(String[] args) { ActorController actorController = new ActorController(); Actor actor1 = actorController.construct(new AngelBuilder()); Actor actor2 = actorController.construct(new DevilBuilder()); System.out.println(actor1); System.out.println(actor2); } }
|
Actor{type=’天使’, sex=’女’, costume=’白裙’}
Actor{type=’恶魔’, sex=’男’, costume=’黑衣’}
建造者模式和工厂模式的区别
- 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
- 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
- 关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成。
- 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。
模式的应用场景
建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。
当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,分离了创建与表示,使创建产品的灵活性大大增加。
建造者模式主要适用于以下应用场景:
- 相同的方法,不同的执行顺序,产生不同的结果。
- 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
- 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
- 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。
**优点 **
- 封装性好 : 创建 和 使用 分离 ;
- 扩展性好 : 建造类之间 相互独立 , 在 一定程度上解耦 ;
缺点 :
- 增加类数量 : 产生多余的 Builder 对象 ;
- 内部修改困难 : 如果 产品内部发生变化 , 建造者也要相应修改 ;