建造者模式
创建型模式
UML
说明
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式用于一步步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容进行构建,用户不需要知道内部的具体构建细节。建造者模式也称为生成器模式。
建造者模式包含四个角色:
Builder:抽象建造者。为创建一个Product对象的各个部件指定的抽象接口
ConcreteBuilder:具体建造者。实现抽象建造者Builder,构建和装配产品的各个组件。做具体的构建工作,但不为客户端所知。
Product:产品,被构建的复杂对象。具体建造者创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包含将这些部件专配成最终的产品的接口。
Director:指挥者。构建一个使用抽象建造者Builder的对象。它与客户端打交道,将客户端创建产品的请求划分为对各个零件的建造请求,再将请求委派给ConcreteBuilder。
示例代码
// 抽象建造者
interface Builder{
// 产品零件建造方法
void buildPart1();
void buildPart2();
}
// 具体建造者1
class ConcreteBuilder1 implements Builder{
private Product product = new Product();
// 产品零件建造方法1
public void buildPart1(){
// 构建产品第一个零件
product.setPart1("软件体系结构");
}
// 产品零件建造方法2
public void buildPart2(){
// 构建产品第二个零件
product.setPart2("软件设计");
}
// 产品返还方法
public Product retrieveResult(){
return product;
}
}
// 具体建造者2
class ConcreteBuilder2 implements Builder{
private int s =0;
// 产品零件建造方法1
public void buildPart1(){
// 构建产品第一个零件
s++;
}
// 产品零件建造方法2
public void buildPart2(){
// 构建产品第二个零件
s++;
}
// 产品返还方法
public int getResult(){
return s;
}
}
// 指挥者
class Director{
// 持有当前需要使用的建造器对象
private Builder builder;
// 构造方法
public Director(Builder builder){
this.builder = builder;
}
public void setBuilder(Builder builder){
this.builder = builder;
}
// 建造方法 construct() 负责调用 ConcreteBuilder 对象的零件建造方法
public void construct(){
builder.buildPart1();
builder.buildPart2();
}
}
// 产品类
class Product{
private String part1;
private String part2;
public String getPart1(){
return part1;
}
public void setPart1(String part1){
this.part1 = part1;
}
public String getPart2(){
return part2;
}
public void setPart2(String part2){
this.part2 = part2;
}
}
// 测试程序
class Test{
public static void main(String[] args){
// 相同的指挥者,不同的具体建造者,建造不同的产品
ConcreteBuilder1 builder1 = new ConcreteBuilder1();
Director director = new Director(builder1);
director.construct();
Product product = builder1.retrieveResult();
System.out.println(product.getPart1()+" "+product.getPart2());
ConcreteBuilder2 builder2 = new ConcreteBuilder2();
director.setBuilder(builder2);
director.construct();
System.out.println(builder2.getResult());
}
}
综述
建造者模式与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
在建造者模式的结构中引入了一个指挥者类,该类的主要作用有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。客户端只需要指导具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
优点
客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他具体建造者无关,因此可以很方便的替换具体建造者或者增加新的具体建造者,还可以更加精细的控制产品的创建过程。
缺点
由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到了一定限制。如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
使用场景
新的具体建造者,还可以更加精细的控制产品的创建过程。
缺点
由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到了一定限制。如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
使用场景
需要生成的对象有复杂的内部结构,这些产品对象通常包含多个成员属性;需要生成的产品对象的属性相互依赖,需要指定其生成顺序;对象的创建过程独立于创建该对象的类;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品。