转自:http://www.runoob.com/design-pattern/builder-pattern.html
建造者(Builder Pattern)模式属于对象的创建模式,可以分布构建对象,将一个对象的属性与对象的创建周期分割开来,从而在创建过程中生成具有不同属性的对象。
介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
三个角色:建造者、具体的建造者、监工、使用者(严格来说不算)
- 建造者角色:定义生成实例所需要的所有方法;
- 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
- 监工角色:定义使用建造者角色中的方法来生成实例的方法;
- 使用者:使用建造者模式。
建造者角色:
package com.wlz;
/**
* @author zhiqiang zhang
* @create 2019-02-15-12:49
**/
public abstract class Builder {
public abstract void buildPart1();
public abstract void buildPart2();
public abstract void buildPart3();
}
监工角色:
package com.wlz;
/** 监工角色
* @author zhiqiang zhang
* @create 2019-02-15-12:53
**/
public class Director {
//对象属性
private Builder builder;
//构造器
public Director(Builder builder){
this.builder=builder;
}
public Builder getBuilder() {
return builder;
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
//定义一个构建过程
public void construct(){
builder.buildPart1();
for(int i=0;i<5;i++){
builder.buildPart2();
}
builder.buildPart3();
}
}
具体建造者:
package com.wlz;
/** 具体的建造者角色
* @author zhiqiang zhang
* @create 2019-02-15-13:06
**/
public class ConcreteBuilder1 extends Builder {
@Override
public void buildPart1() {
System.out.println("构建模块一");
}
@Override
public void buildPart2() {
System.out.println("构建模块二");
}
@Override
public void buildPart3() {
System.out.println("构建模块三");
}
}
测试:
public static void TestBuilder(){
//建造者
ConcreteBuilder1 concreteBuilder1=new ConcreteBuilder1();
//监工
Director director=new Director(concreteBuilder1);
//建造实例
director.construct();
}
运行结果:
构建模块一
构建模块二
构建模块二
构建模块二
构建模块二
构建模块二
构建模块三
扩展
建造者模式的简化:
- 省略抽象建造者角色:如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者。
- 省略指挥者角色:在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略指挥者角色,让
Builder角色扮演指挥者与建造者双重角色。
建造者模式与抽象工厂模式的比较:
- 与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品,而 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
- 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
- 如果将抽象工厂模式看成 汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个 汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。