设计模式-创建型模式之-建造者模式
建造者模式,也叫做生成器模式,是一种对象创建型模式。建造者模式用于创建具有多个部件的复合对象,并隐藏了复合对象的创建过程,不同的部件建造者(Builder生成器)有不同的建造方法。通过建造者模式实现了对象的构建和对象的表示的分离,也就是说,通过同样的构建过程(建造逻辑)可以创建出不同的表示(使用不同的建造者产生不同的建造方式)。
建造者模式中的4种角色:
- 抽象建造者角色Builder:为建造各个组件提供统一的抽象接口;
- 具体建造者角色ConcreteBuilder:实现抽象建造者提供的抽象接口,定义各个组件的建造方法,是组件建造的具体实施者;
- 指挥者Director:调用具体建造者来建造产品的各个组件,指挥者并不知道产品的具体信息,指挥者只负责规定并保证各个组件的建造过程和建造逻辑(指挥建造的过程,比如产品的生产工艺有工序要求);
- 产品角色Product:被建造的复杂对象,包含组合对象的各个部件;
下面以KFC的套餐为例,假设客户点餐后,由机器完成捡餐打包。首先就是产品角色,定义一个类描述KFC套餐:
//最终产品:KFC套餐
class KFCMealSet
{
public:
void setStaple(const std::string &s)
{
staple = s;
}
void setSnack(const std::string &s)
{
snack = s;
}
void setdrink(const std::string &d)
{
drink = d;
}
void showDetail()
{
std::cout << "staple:" << staple << std::endl;
std::cout << "snack:" << snack << std::endl;
std::cout << "snack:" << snack << std::endl;
}
private:
std::string staple; //主食
std::string snack; //小吃
std::string drink; //饮料
};
然后是抽象的建造者角色
//建造者基类:抽象出来的套餐打包机器
class MealSetBuilder
{
public:
virtual void stapleBuilder() = 0; //主食创建接口
virtual void snackBuilder() = 0; //小吃创建接口
virtual void drinkBuilder() = 0; //饮料创建接口
virtual KFCMealSet *getMealSet() = 0; //返回创建好的套餐
};
接着是具体的创建者,这里定义了两个套餐创建类,一个是巨无霸,一个是鸡腿堡:
//巨无霸套餐
class JuWuBaMealSet : public MealSetBuilder
{
public:
JuWuBaMealSet()
{
mealSet = new KFCMealSet();
}
~JuWuBaMealSet()
{
delete mealSet;
}
void stapleBuilder() override
{
mealSet->setStaple("双层巨堡");
}
void snackBuilder() override
{
mealSet->setSnack("大份薯条");
}
void drinkBuilder() override
{
mealSet->setdrink("大杯可乐");
}
KFCMealSet *getMealSet() override
{
return mealSet;
}
private:
KFCMealSet *mealSet;
};
//鸡腿堡套餐
class JiTuiBaoMealSet : public MealSetBuilder
{
public:
JiTuiBaoMealSet()
{
mealSet = new KFCMealSet();
}
~JiTuiBaoMealSet()
{
delete mealSet;
}
void stapleBuilder() override
{
mealSet->setStaple("鸡腿堡");
}
void snackBuilder() override
{
mealSet->setSnack("中份薯条");
}
void drinkBuilder() override
{
mealSet->setdrink("中杯可乐");
}
KFCMealSet *getMealSet() override
{
return mealSet;
}
private:
KFCMealSet *mealSet;
};
最后是指挥者角色,它负责使用建造者,按照一定的逻辑把具体的产品生产出来(比如这里套餐制作时,需要按一定的顺序)
//指挥者:负责产品的建造逻辑,因为工序可能是有一定要求的,例如这里饮料应该最后装,避免装的过程中洒出来
class Director
{
public:
Director(MealSetBuilder *builder)
{
mealSetBuilder = builder;
}
void builderMethod()
{
mealSetBuilder->stapleBuilder();
mealSetBuilder->snackBuilder();
mealSetBuilder->drinkBuilder();
}
private:
MealSetBuilder *mealSetBuilder;
};
使用方式:
int main()
{
KFCMealSet *mealSet;
MealSetBuilder *builder;
Director *director;
builder = new JuWuBaMealSet();
director = new Director(builder);
director->builderMethod();
mealSet = builder->getMealSet();
mealSet->showDetail();
delete builder;
delete director;
return 0;
}

浙公网安备 33010602011771号