1.建造者模式基本介绍
(1)建 造者模式(Builder Pattern ) 又叫生成器模式,是一种对象构建模式。它可以
将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方
法可以构造出不同表现(属性)的对象。
(2) 建 造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象
的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
2.建 造者模式的四个角色
- Product (产品角色): 一个具体的产品对象。
- Builder (抽象建造者): 创建一个Product对象的各个部件指定的 接口/ 抽象类。
- ConcreteBuilder (具体建造者): 实现接口,构建和装配各个部件。
- Director (指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个
复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,
二是:
负责控制产品对象的生产过程。
产品类:
/**
* @Description 复杂对象是指那些包含多个成员属性的对象,这些成员属性也称为部件或零件,如汽车包括方向盘、发动机、轮胎等部件,电子邮件包括发件人、收件人、主题、内容、附件等部件,一个典型的复杂对象类代码示例如下:
**/
public class Product {
private String partA; //
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
}
抽象构造
/**
* @Description 抽象建造者类中定义了产品的创建方法和返回方法
**/
public abstract class Builder {
private Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult() {
return product;
}
}
指挥者:
/**
* @Description
* 一方面它隔离了客户与创建过程;另一方面它控制产品的创建过程,
* 包括某个buildPartX()方法是否被调用以及多个buildPartX()方法调用的先后次序等。
* 指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,
* 即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
* 在实际生活中也存在类似指挥者一样的角色,
* 如一个客户去购买电脑,电脑销售人员相当于指挥者,
* 只要客户确定电脑的类型,电脑销售人员可以通知电脑组装人员给客户组装一台电脑。
*
**/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
具体构造:
/**
* @Description 具体实现构建和装配各个部件。
**/
public class ConcrteBuilder extends Builder {
@Override
public void buildPartA() {
System.out.println("A构建");
}
@Override
public void buildPartB() {
System.out.println("B构建");
}
@Override
public void buildPartC() {
System.out.println("C构建");
}
}
测试代码:
public class Test {
public static void main(String[] args) {
//
Director director = new Director(new ConcrteBuilder());
Product product = director.construct();
}
}
-
客户端(使用程序) 不 必知道产品内部组成的细节,将产品本身与产品的创建过程解
耦,使得相同的创建过程可以创建不同的产品对 象 -
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替
换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同
的产品对 象 -
可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法
中,使得创建过程更加清晰,也更方便使用程序来控制创建过程 -
增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,
系统扩展方便,符合 “开闭原则 -
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似, 如果产品之间
的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 -
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,
导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式. -
抽象工厂模式VS 建造者模 式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不
同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品
由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要
目的是通过组装零配件而产生一个新产品