学习建造者模式的时候,总觉的似曾相识,不自禁的联想到(抽象)工厂方法模式/模板方法模式/桥接模式… …在埋怨自己没有把这些模式吃透的情况下同时又有点小激动——不知不觉已经学了这么多模式了
下面开始介绍建造者模式。
首先,按照自己的理解先把联想到的这几个设计模式简单的再理一理:
(抽象)工厂方法模式:不同的产品由该类的生成厂家负责产出,强调产品分类和各司其职,便于类后续扩展管理。
模板方法模式:将流程封装,每一流程的具体方法可以改变,最终组合起来实现不同的目的。强调流程的一致性和方法的多样性。
桥接模式:通过类之间的聚合或组合关系来代替继承,便于类之间的自由组合,产出不同类型的产品。强调自由组合搭配,生成出不同的东西。
然后,举个建造者的例子。你可能会感觉,建造者模式好似是结合了上述设计模式的一些不同特点的产物。
随便举一个,因为我戴眼镜,就比如眼镜吧:有眼睛框,眼睛腿,鼻托和镜片构成。(有的都是一体的,暂且不论,假设就是这几部分而且是分离的)。你去配眼镜,有眼镜店A和B,眼镜店A分别有货(眼睛框Q1,眼睛框Q2,眼睛腿W1,眼睛腿W2,鼻托E1,鼻托E2,镜片R1,镜片R2)。眼镜店B分别有货(眼睛框V1,眼睛框V2,眼睛腿N1,眼睛腿N2,鼻托M1,鼻托M2,镜片K1,镜片K2)。你选的眼镜肯定是由该眼镜店里面所拥有的部件构成的,当然,你选择的部件不同,眼镜的性能和价位也不一样。而店主会根据你的要求来做一副眼睛给你。那眼镜的生成过程可以用建造者模式来描述。
上代码如下。
#include<iostream>
using namespace std;
class Glasses //眼镜
{
public:
void show()
{
cout << "我买了一幅由" << m_glassesFrames.c_str() << "+" << m_spectacles.c_str() << "+" << m_nosePads.c_str() << "+" << m_eyeglasses.c_str() << "构成的眼镜"<<endl;
}
public:
string m_glassesFrames; //眼镜框
string m_spectacles; //眼镜腿
string m_nosePads; //鼻托
string m_eyeglasses; //眼镜片
};
class OpticalShop //眼镜店基类
{
public:
virtual void choose_glassesFrames(string frames) = 0; //选择镜框
virtual void choose_spectacles(string spectacles) = 0; //选择镜腿
virtual void choose_nosePads(string nosePads) = 0; //选择鼻托
virtual void choose_eyeglasses(string eyeglasses) = 0; //选择镜片
virtual void give_customer() = 0; //将眼镜给顾客
};
class OpticalShopA:public OpticalShop //实体眼镜店A
{
public:
void choose_glassesFrames(string frames)//选择镜框
{
new_glasses.m_glassesFrames = frames;
}
void choose_spectacles(string spectacles)//选择镜腿
{
new_glasses.m_spectacles = spectacles;
}
void choose_nosePads(string nosePads)//选择鼻托
{
new_glasses.m_nosePads = nosePads;
}
void choose_eyeglasses(string eyeglasses)//选择镜片
{
new_glasses.m_eyeglasses = eyeglasses;
}
void give_customer()
{
new_glasses.show();
}
private:
Glasses new_glasses;
};
class OpticalShopB :public OpticalShop //实体眼镜店B
{
public:
void choose_glassesFrames(string frames)//选择镜框
{
new_glasses.m_glassesFrames = frames;
}
void choose_spectacles(string spectacles)//选择镜腿
{
new_glasses.m_spectacles = spectacles;
}
void choose_nosePads(string nosePads)//选择鼻托
{
new_glasses.m_nosePads = nosePads;
}
void choose_eyeglasses(string eyeglasses)//选择镜片
{
new_glasses.m_eyeglasses = eyeglasses;
}
void give_customer()
{
new_glasses.show();
}
private:
Glasses new_glasses;
};
class Director //创建者类,结合了顾客选定眼镜店,眼镜零件和眼镜组装的过程(注:这里其实可以再分的,我按自己的理解写了)
{
public:
Director(OpticalShop *chooseShop,Glasses *chooseGlasses)
{
choose_glasses = chooseGlasses;
choose_shop = chooseShop;
}
void bulid()
{
choose_shop->choose_glassesFrames(choose_glasses->m_glassesFrames);
choose_shop->choose_spectacles(choose_glasses->m_spectacles);
choose_shop->choose_nosePads(choose_glasses->m_nosePads);
choose_shop->choose_eyeglasses(choose_glasses->m_eyeglasses);
choose_shop->give_customer();
}
protected:
Glasses *choose_glasses;
OpticalShop *choose_shop;
};
void main()
{
OpticalShop *choose_shop = new OpticalShopA(); //根据性价比,选定眼镜店A
//自己选一幅眼镜配件——下面这些可以写成成员函数写在类中的,但是我比较懒,拿出来写了,但是应该不影响主体思想?
Glasses *choose_glasses = new Glasses();
choose_glasses->m_glassesFrames = "眼镜框Q2";
choose_glasses->m_spectacles= "眼镜腿W1";
choose_glasses->m_nosePads = "鼻托E1";
choose_glasses->m_eyeglasses = "镜片R1";
Director construct(choose_shop, choose_glasses); //将情况告诉眼镜店老板,老板做好眼镜给我
construct.bulid();
system("pause");
return;
}
仔细看代码,是不是有工厂方法模式(OpticalShop分类)/模板方法模式(Director封装流程)/桥接模式(眼镜配件互相组合搭配)的思想?