如果要构建的对象很复杂,那么可以将整个构建过程拆分成多个步骤,并为每一个步骤定义一个抽象的接口。并添加一个指导者用来控制构建产品的顺序和步骤。
Java实现:
// 产品类
class Product {private String part1;private String part2;public void setPart1(String part1) {this.part1 = part1;}public void setPar2(String part2) {this.part2 = part2;}// 其他属性和方法
}// 抽象建造者接口
interface Builder {void buildPart1(String part1);void buildPart2(String part2);Product getResult();
}// 具体建造者类
class ConcreteBuilder implements Builder {private Product product = new Product();@Overridepublic void buildPart1(String part1) {product.setPart1(part1);}@Overridepublic void buildPart2(String part2) {product.setPart2(part2);}@Overridepublic Product getResult() {return product;}
}
// 指导者类
class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}// 调用方法构建产品public void construct() {builder.buildPart1("Part 1");builder.buildPart2("Part 2");}
}public class Main {public static void main(String[] args) {// 创建指导者和建造者对象Builder builder = new ConcreteBuilder();Director director = new Director(builder);// 指导者构建产品director.construct();// 获取构建好的产品Product product = builder.getResult();// 输出产品信息System.out.println(product);}
}
【设计模式专题之建造者模式】4. 自行车加工
CPP版题解:
#include <iostream>
#include <string>
using namespace std;class Bike {
public:string frame;string tires;void setFrame(const string& frame) {this->frame = frame;}void setTires(const string& tires) {this->tires = tires;}friend ostream& operator << (ostream& os, const Bike& bike) {os << bike.frame << " " << bike.tires;return os;}
};class BikeBuilder {
public:virtual void buildFrame() = 0;virtual void buildTires() = 0;virtual Bike getResult() = 0;
};class MountainBikeBuilder : public BikeBuilder {
private:Bike bike;
public:void buildFrame() override {bike.setFrame("Aluminum Frame");}void buildTires() override {bike.setTires("Knobby Tires");}Bike getResult() override {return bike;}
};
class RoadBikeBuilder : public BikeBuilder {
private:Bike bike;
public:void buildFrame() override {bike.setFrame("Carbon Frame");}void buildTires() override {bike.setTires("Slim Tires");}Bike getResult() override {return bike;}
};class BikeDirector {
public:Bike construct(BikeBuilder& builder) {builder.buildFrame();builder.buildTires();return builder.getResult();}
};int main() {int N;cin >> N;BikeDirector director;for (int i = 0; i < N; i++) {string bikeType;cin >> bikeType;BikeBuilder* builder;if (bikeType == "mountain") {builder = new MountainBikeBuilder();} else {builder = new RoadBikeBuilder();}Bike bike = director.construct(*builder);cout << bike << endl;delete builder;}return 0;
}