建造者模式(Builder Pattern)又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
这个 Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个 Builder 可以使接口也可以是抽象类,在这里我们使用抽象类。
三个角色:建造者、具体的建造者、监工、使用者(严格来说不算)
- 建造者角色:定义生成实例所需要的所有方法;
- 具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
- 监工角色:定义使用建造者角色中的方法来生成实例的方法;
- 使用者:使用建造者模式。
注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。
第一步、创建构建者接口或者抽象类
package builder.demo.build;
/**
* 建造者抽象类也可以是接口
*/
public abstract class Builder {
StringBuffer buffer = new StringBuffer();//假设 buffer.toString() 就是最终生成的产品
public abstract void buildPart1();
public abstract void buildPart2();
public abstract void buildPart3();
public String getResult() {//定义获取最终生成实例的方法
return buffer.toString();
}
}
第二部、创建具体的构建者
package builder.demo.build;
/**
* 具体建造者1
*/
public class ConcreteBuilder1 extends Builder {
@Override
public void buildPart1() {//实现构建最终实例需要的所有方法
buffer.append("Builder1 : Part1\n");
}
@Override
public void buildPart2() {
buffer.append("Builder1 : Part2\n");
}
@Override
public void buildPart3() {
buffer.append("Builder1 : Part3\n");
}
}
package builder.demo.build;
/**
* 具体建造者2
*/
public class ConcreteBuilder2 extends Builder{
@Override
public void buildPart1() {//实现构建最终实例需要的所有方法
buffer.append("Builder2 : Part1\n");
}
@Override
public void buildPart2() {
buffer.append("Builder2 : Part2\n");
}
@Override
public void buildPart3() {
buffer.append("Builder2 : Part3\n");
}
}
第三步、创建建工,它包含了构建者,并且控制构建过程
package builder.demo.director;
import builder.demo.build.Builder;
/**
* 监工
* 将一个复杂的构建过程与其表示相分离
*/
public class Director {
private Builder builder; // 针对接口编程,而不是针对实现编程
public Director(Builder builder) {
this.builder = builder;
}
/**
* 监工开始定义和控制构建的具体过程
*/
public void construct() {
builder.buildPart1();
for (int i = 0; i < 5; i++) {
builder.buildPart2();
}
builder.buildPart3();
}
}
第四步、测试
package builder.demo;
import builder.demo.build.Builder;
import builder.demo.build.ConcreteBuilder1;
import builder.demo.build.ConcreteBuilder2;
import builder.demo.director.Director;
public class Client {
public static void main(String[] args) {
Builder b1 = new ConcreteBuilder1();//建造者1
Director director = new Director(b1);//监工
director.construct();//建造实例(监工负责过程的控制,建造者实际建造)
System.out.printf("the result is :%n%s", b1.getResult());//获取最终生成结果
Builder b2 = new ConcreteBuilder2();//建造者2
director = new Director(b2);//监工
director.construct();//建造实例(监工负责过程的控制,建造者实际建造)
System.out.printf("\nthe result is :%n%s", b2.getResult());//获取最终生成结果
}
}
the result is :
Builder1 : Part1
Builder1 : Part2
Builder1 : Part2
Builder1 : Part2
Builder1 : Part2
Builder1 : Part2
Builder1 : Part3
the result is :
Builder2 : Part1
Builder2 : Part2
Builder2 : Part2
Builder2 : Part2
Builder2 : Part2
Builder2 : Part2
Builder2 : Part3
扫描二维码关注公众号,回复:
10789130 查看本文章