[设计模式]建造者模式
目录
简介
建造者模式 (Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构
图-建造者模式结构图
Product : 产品类,由多个部件构成。
class Product {
List<String> parts = new ArrayList<String>();
public void AddPart(String part) {
parts.add(part);
}
public void show() {
System.out.println("============== 产品创建 ==============");
for (String part : parts) {
System.out.println(part);
}
}
}
List<String> parts = new ArrayList<String>();
public void AddPart(String part) {
parts.add(part);
}
public void show() {
System.out.println("============== 产品创建 ==============");
for (String part : parts) {
System.out.println(part);
}
}
}
Builder : 抽象建造者,确定产品由ABC三个部件构成,并声明一个得到产品建造后结果的方法getResult。
interface Builder {
public void buildPartA();
public void buildPartB();
public void buildPartC();
public Product getResult();
}
public void buildPartA();
public void buildPartB();
public void buildPartC();
public Product getResult();
}
ConcreteBuilder : 实现Builder接口中的具体方法。
class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.AddPart("部件A");
}
@Override
public void buildPartB() {
product.AddPart("部件B");
}
@Override
public void buildPartC() {
product.AddPart("部件C");
}
@Override
public Product getResult() {
return product;
}
}
private Product product = new Product();
@Override
public void buildPartA() {
product.AddPart("部件A");
}
@Override
public void buildPartB() {
product.AddPart("部件B");
}
@Override
public void buildPartC() {
product.AddPart("部件C");
}
@Override
public Product getResult() {
return product;
}
}
Director : 指挥者类,指挥建造Product的过程(控制构建各部分组件的顺序)。
class Director {
public void construct(Builder builder) {
builder.buildPartC();
builder.buildPartA();
builder.buildPartB();
}
}
public void construct(Builder builder) {
builder.buildPartC();
builder.buildPartA();
builder.buildPartB();
}
}
Client : 用户并不需要知道具体的建造过程,只需指定建造 Product 具体类型。
public class BuilderPattern {
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
director.construct(builder);
Product product = builder.getResult();
product.show();
}
}
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
director.construct(builder);
Product product = builder.getResult();
product.show();
}
}
运行结果
============== 产品创建 ==============
部件C
部件A
部件B
部件C
部件A
部件B
动机
创建一个复杂对象的算法,这个算法应当独立于对象的组成部分以及它们的装配方式。
构建过程必须允许构建对象时有不同的表示。
要点
建造者模式允许修改一个产品的内部表示。
它将构造和表示两块代码隔离开来。
它很好的控制了构建过程。
图-建造者模式时序图
关键流程
客户端创建 Director 对象并配置它所需要的 Builder 对象。
Director 负责通知 builder 何时建造 product 的部件。
Builder处理 director 的请求并添加 product 的部件。
客户端从 builder 处获得 product。
Director 负责通知 builder 何时建造 product 的部件。
Builder处理 director 的请求并添加 product 的部件。
客户端从 builder 处获得 product。
实例
想象一下盖房子的场景。
一栋房子是由地基、墙、屋顶、门、窗各部分组合而成的。
盖房子需要有建筑工人负责建造,有工程师负责画建筑图纸。
House (Product角色)
package com.zp.java.patterns.builder;
import java.util.ArrayList;
import java.util.List;
// Product角色,由多个部件构成
public class House {
List<String> parts = new ArrayList<String>();
public void addPart(String part) {
parts.add(part);
}
public void show() {
System.out.println("======= 房子展示 =======");
for (String part : parts) {
System.out.println(part);
}
}
}
import java.util.ArrayList;
import java.util.List;
// Product角色,由多个部件构成
public class House {
List<String> parts = new ArrayList<String>();
public void addPart(String part) {
parts.add(part);
}
public void show() {
System.out.println("======= 房子展示 =======");
for (String part : parts) {
System.out.println(part);
}
}
}
Builder
package com.zp.java.patterns.builder;
// Builder角色 ,提供构建产品各部件的方法,并提供一个获得完整产品的方法。
public interface Builder {
public void buildFoundation();
public void buildWall();
public void buildRoof();
public void buildWindow();
public void buildDoor();
public House createHouse();
}
// Builder角色 ,提供构建产品各部件的方法,并提供一个获得完整产品的方法。
public interface Builder {
public void buildFoundation();
public void buildWall();
public void buildRoof();
public void buildWindow();
public void buildDoor();
public House createHouse();
}
Worker (ConcreteBuilder角色)
package com.zp.java.patterns.builder;
// ConcreteBuilder角色,实现 Builder 接口中的具体方法。
public class Worker implements Builder {
private House house = new House();
@Override
public void buildFoundation() {
house.addPart("地基");
}
@Override
public void buildWall() {
house.addPart("墙");
}
@Override
public void buildRoof() {
house.addPart("房顶");
}
@Override
public void buildWindow() {
house.addPart("窗户");
}
@Override
public void buildDoor() {
house.addPart("门");
}
@Override
public House createHouse() {
return house;
}
}
// ConcreteBuilder角色,实现 Builder 接口中的具体方法。
public class Worker implements Builder {
private House house = new House();
@Override
public void buildFoundation() {
house.addPart("地基");
}
@Override
public void buildWall() {
house.addPart("墙");
}
@Override
public void buildRoof() {
house.addPart("房顶");
}
@Override
public void buildWindow() {
house.addPart("窗户");
}
@Override
public void buildDoor() {
house.addPart("门");
}
@Override
public House createHouse() {
return house;
}
}
Engineer (Director角色)
package com.zp.java.patterns.builder;
// Director角色,指挥构建产品的过程(控制构建顺序)
public class Engineer {
public void conduct(Builder builder) {
builder.buildFoundation();
builder.buildWall();
builder.buildRoof();
builder.buildWindow();
builder.buildDoor();
}
}
// Director角色,指挥构建产品的过程(控制构建顺序)
public class Engineer {
public void conduct(Builder builder) {
builder.buildFoundation();
builder.buildWall();
builder.buildRoof();
builder.buildWindow();
builder.buildDoor();
}
}
Client
客户无需了解具体的构造细节。
package com.zp.java.patterns.builder;
public class Test {
public static void main(String[] args) {
Builder builder = new Worker();
Engineer engineer = new Engineer();
engineer.conduct(builder);
House house = builder.createHouse();
house.show();
}
}
public class Test {
public static void main(String[] args) {
Builder builder = new Worker();
Engineer engineer = new Engineer();
engineer.conduct(builder);
House house = builder.createHouse();
house.show();
}
}
运行结果
======= 房子展示 =======
地基
墙
房顶
窗户
门
地基
墙
房顶
窗户
门