您的位置:首页 > 产品设计 > UI/UE

设计模式读书笔记(三) Builder(建造者)模式

2016-07-02 17:04 615 查看

一、模式介绍

在平常的时候,我们不管是上KFC还是去买组装电脑,我们都会遇到这样一个现象:就是不管我们的需求怎么变化,我们只要点下了我们想要的餐品,服务员下单完毕之后,不用多久,我们的自定义套餐就上来了。

这其实就是建造者模式的一个具现化,作为装配工,他不管你需要的是劲辣鸡腿堡还是深海鳕鱼堡,不管你要的是甜筒还是圣代,只要给他一份订单,他就能三下五除二地把你的套餐装配好。

引用一下深入浅出设计模式里的话:GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构 造复杂对象的过程和组成对象的部件解耦。就像攒电脑一样,不管什么品牌的配件,只要兼 容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用 性精神的一种贯彻

下面我们看看UML图的表示:



对于客户来说,只需知道指导者即可(也就是相当于我们在KFC里面遇到的下单员),通过指导者,客户就能构造复杂的对象(一份套餐)

二、模式实现

假设我们现在有一家大型的快餐连锁店,里面可以提供KFC和MC的套餐,客人根据自己下单来选择套餐。

先新建一个虚拟的建造者类,里面定义了组装套餐的接口,分别是放入汉堡,饮料和薯条

class Builder
{
public:
Builder(){ cout << "Builder!" << endl; };
virtual ~Builder(){};
virtual void BuildPartHamburger() = 0;
virtual void BuildPartDrink() = 0;
virtual void BuildPartChips() = 0;
};


下面创建具体的套餐建造者

class KFCBuilder :public Builder
{
public:
KFCBuilder() :Builder()
{
cout << "Welcome to KFC" << endl;
}
~KFCBuilder(){};

void BuildPartHamburger()
{
cout << "KFC Hamburger" << endl;
}
void BuildPartDrink()
{
cout << "KFC Drink" << endl;
}
void BuildPartChips()
{
cout << "KFC Chips" << endl;
}

};

class MCBuilder :public Builder
{
public:
MCBuilder() :Builder()
{
cout << "Welcome to Mc" << endl;
}
~MCBuilder(){};

void BuildPartHamburger()
{
cout << "Mc Hamburger" << endl;
}
void BuildPartDrink()
{
cout << "Mc Drink" << endl;
}
void BuildPartChips()
{
cout << "Mc Chips" << endl;
}

};


接下来是指导者的角色:

enum ProductType
{
KFC,
Mc
};

class Director
{
public:
Director(ProductType t) :builder(NULL)
{
switch (t)
{
case ProductType::KFC:
builder = new KFCBuilder();
break;
case ProductType::Mc:
builder = new MCBuilder();
break;
default:
cout << "No such Product" << endl;
break;
}
}
~Director()
{
if (builder)
delete builder;
builder = NULL;
}

void Create()
{
builder->BuildPartHamburger();
builder->BuildPartDrink();
builder->BuildPartChips();
}
private:
Builder *builder;
};


这里面,指导者在Create函数里面指导建造者进行了装配,最后,客户只要告诉指导者他要哪个套餐即可

int main()
{
Director *director = new Director(ProductType::KFC);
director->Create();
delete director;
}


输出结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息