设计模式(3)-建造者模式及实现
基本概念
提供了一种将一个复杂对象的构建过程与其表示分离的方法。它将对象的构建过程封装在一个独立的"建造者"类中,由该类负责逐步构建对象。这样,可以根据需要创建不同的建造者来构建不同的对象变体。
优点:
● 分离构建过程和表示:通过建造者模式,可以将复杂对象的构建过程与其最终表示分离,使得构建过程更加清晰可控。
● 支持不同的表示:通过使用不同的具体建造者,可以创建不同的产品表示,而不改变客户端的代码。
● 更好的可扩展性:如果需要添加新的产品变体,只需创建一个新的具体建造者即可,而无需修改已有的代码。
● 隐藏产品的内部结构:客户端只需与抽象建造者和指导者交互,无需关心产品的内部构建细节。
https://gitee.com/want-to-lose-another-30-jin/design-pattern-implementation
设计模式具体实现
角色
1、Builder(建造者):定义创建复杂对象的接口,通常包含创建对象的各个部分的步骤。
2、ConcreteBuilder(具体建造者):实现Builder接口,具体定义构建对象的步骤和细节。
3、Product(产品):表示被构建的复杂对象。
4、Director(指挥者):负责构建对象的步骤,使用Builder接口来创建对象,不依赖于具体建造者的实现。
java实现
package com.shejimoshi.jianzaozhemoshi;
// 产品类
public class Car {
private String engine;
private String tires;
private String color;
// Setter方法
public void setEngine(String engine){
this.engine = engine;
}
public void setTires(String tires){
this.tires = tires;
}
public void setColor(String color){
this.color = color;
}
// Getter方法
public String getEngine() {
return engine;
}
public String getTires() {
return tires;
}
public String getColor() {
return color;
}
}
package com.shejimoshi.jianzaozhemoshi;
//抽象的建造者
public interface CarBuilder {
/**
* 组合Car
*/
Car car = new Car();
void buildEngine();
void buildTires();
void buildColor();
public Car build();
}
package com.shejimoshi.jianzaozhemoshi;
// 具体建造者
public class ConcreteCarBuilder implements CarBuilder {
Car car=new Car();
@Override
public void buildEngine() {
car.setEngine("v8");
}
@Override
public void buildTires() {
car.setTires("Alloy");
}
@Override
public void buildColor() {
car.setColor("red");
}
@Override
public Car build() {
return car;
}
}
package com.shejimoshi.jianzaozhemoshi;
// 指挥者
public class CarDirector {
public Car construct(CarBuilder builder) {
builder.buildEngine();
builder.buildColor();
builder.buildTires();
return builder.build();
}
}
package com.shejimoshi.jianzaozhemoshi;
public class Client {
public static void main(String[] args) {
// 创建指挥者对象
CarDirector director = new CarDirector();
// 创建具体建造者对象
ConcreteCarBuilder builder = new ConcreteCarBuilder();
// 使用指挥者来构建汽车对象
Car car = director.construct(builder);
// 打印汽车的属性,以验证对象是否正确构建
System.out.println("Car created with:");
System.out.println("Engine: " + car.getEngine());
System.out.println("Tires: " + car.getTires());
System.out.println("Color: " + car.getColor());
}
}
c++实现
#include<iostream>
#include <string>
using namespace std;
class Car
{
private:
string engine;
string color;
string tires;
public:
void setColor(string color) {
this->color = color;
}
void setEngine(string engine) {
this->engine = engine;
}
void setTires(string tires) {
this->tires = tires;
}
// Getter方法
string getEngine()
{
return engine;
}
string getTires()
{
return tires;
}
string getColor()
{
return color;
}
};
class CarBuilder
{
public:
Car car;
virtual void buildEngine() = 0;
virtual void buildTires() = 0;
virtual void buildColor() = 0;
virtual Car build() = 0;
virtual ~CarBuilder() {}
};
class ConcreteCarBuilder : public CarBuilder
{
public:
Car car;
void buildEngine() override
{
car.setEngine("v8");
}
void buildTires() override
{
car.setTires("Alloy");
}
void buildColor() override
{
car.setColor("red");
}
Car build() override
{
return car;
}
};
class CarDirector
{
public:
Car construct(ConcreteCarBuilder builder)
{
builder.buildEngine();
builder.buildColor();
builder.buildTires();
return builder.build();
}
};
int main() {
// 创建指挥者对象
CarDirector director;
// 创建具体建造者对象
ConcreteCarBuilder builder;
// 使用指挥者来构建汽车对象
Car car = director.construct(builder);
// 打印汽车的属性,以验证对象是否正确构建
cout << "Car created with:" << endl;
cout << "Engine: "<< car.getEngine() << endl;
cout << "Tires: "<< car.getTires() << endl;
cout << "Color: " << car.getColor() << endl;
return 0;
}