建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。产品的组成部分是不变的,但每一部分是可以灵活选择的。
该模式的主要优点如下:
- 各个具体的建造者相互独立,解耦度高,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,可直接使用,规避风险。
其缺点如下:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类,导致可维护性差。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程(组成部分要相同),而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
模式的结构与实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
1. 模式的结构
建造者(Builder)模式的主要角色如下。
- 产品角色(House):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
- 抽象建造者(AbsBuilder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(*Builder):实现/继承 AbsBuilder 接口/抽象方法,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
1、抽象构建者
package com.zzyo.build;
//抽象建造者
public abstract class AbsBuilder {
abstract void buildPartA();
abstract void buildPartB();
abstract void buildPartC();
House getResult(){
return new House();
}
}
2、具体建造者
package com.zzyo.build;
//普通建造者
public class CommonBuilder extends AbsBuilder{
@Override
void buildPartA() {
System.out.println("普通计划A " );
}
@Override
void buildPartB() {
System.out.println("普通计划B " );
}
@Override
void buildPartC() {
System.out.println("普通计划C" );
}
}
package com.zzyo.build;
//高级建造者
public class HighBuilder extends AbsBuilder {
@Override
void buildPartA() {
System.out.println("高级计划A");
}
@Override
void buildPartB() {
System.out.println("高级计划B");
}
@Override
void buildPartC() {
System.out.println("高级计划C");
}
}
3、产品
package com.zzyo.build;
import lombok.Data;
@Data
public class House {
String partA;
String partB;
String partC;
}
4、构建者,装修工人
package com.zzyo.build;
//构建者 装修工人
public class Director {
private AbsBuilder absBuilder;
//构建
public Director(AbsBuilder absBuilder) {
this.absBuilder = absBuilder;
}
//产品组装与构建
public House construct() {
absBuilder.buildPartA();
absBuilder.buildPartB();
absBuilder.buildPartC();
return absBuilder.getResult();
}
}
5、客户端测试
package com.zzyo.build;
//测试客户端
public class Clien {
public static void main(String[] args) {
CommonBuilder commonBuilder = new CommonBuilder();
Director director = new Director(commonBuilder);
director.construct();
HighBuilder highBuilder = new HighBuilder();
Director director1 = new Director(highBuilder);
director1.construct();
}
}