设计模式---建造者模式

94 阅读2分钟

定义

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程分离出来,使得相同的构建过程可以创建不同的表示。建造者模式特别适合于需要生成的对象具有复杂结构,且各部分存在多种配置的方法。

结构

  • Builder(抽象建造者) :定义构建产品的抽象接口,规定了创建产品各个部分的方法。

  • ConcreteBuilder(具体建造者) :实现 Builder 接口,具体实现各个部分的创建方法,并最终返回一个产品实例。

  • Director(指挥者) :负责安排具体建造者的构建步骤,指挥构建过程。

  • Product(产品) :表示被构建的复杂对象。

代码示例

#include <iostream>
#include <string>

// 产品类:汽车
class Car
{
public:
	std::string engine;
	std::string wheels;
	std::string body;

	void show() {
		std::cout << "Car with " << engine << ", " << wheels << ", " << body << std::endl;
	}
};


// 抽象建造者
class CarBuilder
{
public:
	virtual void buildEngine() = 0;
	virtual void buildWheels() = 0;
	virtual void buildBody() = 0;
	virtual Car* getCar() = 0;
	virtual ~CarBuilder() = default;
};


// 具体建造者1:运动型汽车类
class SportCarBuilder :public CarBuilder
{
private:
	Car* car;

public:
	SportCarBuilder()
	{
		car = new Car();
	}

	void buildEngine() override
	{
		car->engine = "V8 Engine";
	}

	void buildWheels() override 
	{
		car->wheels = "18 inch Alloy Wheels";
	}

	void buildBody() override 
	{
		car->body = "Sleek Sports Body";
	}

	Car* getCar() override 
	{
		return car;
	}
};


// 具体建造者2:家用汽车类
class FamilyCarBuilder : public CarBuilder {
private:
	Car* car;

public:
	FamilyCarBuilder() 
	{
		car = new Car();
	}

	void buildEngine() override 
	{
		car->engine = "V6 Engine";
	}

	void buildWheels() override 
	{
		car->wheels = "16 inch Steel Wheels";
	}

	void buildBody() override 
	{
		car->body = "Spacious Family Body";
	}

	Car* getCar() override 
	{
		return car;
	}
};


// 指挥者
class Director
{
private:
	CarBuilder* builder;

public:
	void setBuilder(CarBuilder* builder)
	{
		this->builder = builder;
	}

	Car* construct()
	{
		builder->buildEngine();
		builder->buildWheels();
		builder->buildBody();
		return builder->getCar();
	}
};


int main()
{
	Director director;

	// 建造运动型汽车
	SportCarBuilder scb;
	director.setBuilder(&scb);
	Car* sportCar = director.construct();
	sportCar->show();
	delete sportCar;

	// 建造家用型汽车
	FamilyCarBuilder fcb;
	director.setBuilder(&fcb);
	Car* familyCar = director.construct();
	familyCar->show();
	delete familyCar;

	system("pause");
	return 0;
}
  • Car 是产品类,表示被构建的复杂对象。

  • CarBuilder 是抽象建造者,定义了构建产品的方法接口。

  • SportsCarBuilder 是具体建造者,实现了构建产品的具体方法。

  • Director 是指挥者,负责安排构建步骤。

  • 客户端通过 Director 来构建产品对象。

通过添加不同的具体建造者,我们可以灵活地构建不同类型的产品,同时保持客户端代码的简洁和可维护性。