标签:
26.1 工厂方法模式 VS 建造者模式
26.1.1 按工厂方法建造超人
(1)产品:两类超人,成年超人和未成年超人。
(2)工厂:这里选择简单工厂
【编程实验】工厂方法建造超人
//创建型模式大PK——工厂方法和建造者模式 //实例:利用简单工厂创建的超人 #include <iostream> using namespace std; //***************************抽象产品接口********************* //超人接口 class ISuperMan { public: //每个超人都有特殊的技能 virtual void specialTalent() = 0; virtual ~ISuperMan(){} }; //*************************具体产品*********************** //成年超人 class AdultSuperMan : public ISuperMan { public: void specialTalent() { cout << "超人力大无穷" <<endl; } }; //未成年人超人 class ChildSuperMan : public ISuperMan { public: void specialTalent() { cout << "小超人的能力是刀枪不入、快速移动" <<endl; } }; //***********************简单工厂**************************** class SuperManFactory { public: static ISuperMan* createSuperMan(string type) { //根据输入参数产生不同的超人 if(type == "adult") { return new AdultSuperMan(); } else if (type == "child") { return new ChildSuperMan(); } else return NULL; } }; int main() { //模拟生产超人(注意从生产工厂里出来的产品(如adult)都是一个模 //样的,没有特殊的地方,这与后面的建造者模式有很大的不同) ISuperMan* sm = SuperManFactory::createSuperMan("child"); //展示一下超人的技能 sm->specialTalent(); delete sm; return 0; };
26.1.2 按建造者模式建造超人
(1)产品的三大组成部分:躯体、特殊技能、身份标记
(2)建造者:Builder。注意,与标准的建造者模式不同,这里的部件如何组装的过程由各个具体的建造者负责,而标准的作法是放到Director角色中去完成的。
//创建型模式大PK——工厂方法和建造者模式 //实例:利用建造者模式创建的超人 #include <iostream> using namespace std; //***************************辅助类********************* //超人的身驱 class Body { string body; public: string& getBody(){return body;} void setBody(string value) { body = value; } }; //特殊技能 class SpecialTalent { string specialTalent; public: string& getSpecialTalent(){return specialTalent;} void setSpecialTalent(string value) { specialTalent = value; } }; //超人的标志 class SpecialSymbol { string symbol; public: string& getSymbol(){return symbol;} void setSymbol(string value) { symbol = value; } }; //超人 class SuperMan { private: Body body; SpecialSymbol specialSymbol; SpecialTalent specialTalent; public: string& getBody(){return body.getBody();} void setBody(string value) { body.setBody(value); } string& getSpecialTalent(){return specialTalent.getSpecialTalent();} void setSepcialTalent(string value) { specialTalent.setSpecialTalent(value); } string& getSpecialSymbol(){return specialSymbol.getSymbol();} void setSpecialSymbol(string value) { specialSymbol.setSymbol(value); } virtual ~SuperMan(){} }; //*************************Builder角色*********************** //抽象建造者 class Builder { protected: SuperMan* superMan; public: Builder() { superMan = new SuperMan(); } //构建出超人的躯体 void setBody(string value) { superMan->setBody(value); } //构建出超人的特殊技能 void setSpecialTalent(string value) { superMan->setSepcialTalent(value); } //构建出超人的特殊标记 void setSpecialSymbol(string value) { superMan->setSpecialSymbol(value); } //构建出一个完整的超人 //超人的各个部件都准备好了,具体怎么组装由实现类来决定, //体现建造者模式将复杂对象的构建和表示分离的意图 virtual SuperMan* getSuperMan() = 0; virtual ~Builder() { delete superMan; } }; //成年超人建造者 class AdultSuperManBuilder :public Builder { public: SuperMan* getSuperMan() { //1.标准的建造者模式,建造过程是放在Director中进行装配的。 //2.建造者模式关注产品的各个部分,甚至构建顺序, // 即相同的部件,装配顺序不同,产生的结果也可能不同, // 这正是建造者模式的意图) superMan->setBody("强壮的躯体"); superMan->setSepcialTalent("会飞行"); superMan->setSpecialSymbol("胸前带S标记"); return superMan; } }; //未成年超人建造者 class ChildSuperManBuilder :public Builder { public: SuperMan* getSuperMan() { //建造过程 superMan->setBody("强壮的躯体"); superMan->setSepcialTalent("刀枪不入"); superMan->setSpecialSymbol("胸前带小S标记"); return superMan; } }; //导演类 class Director { private: static Builder* adultBuilder; static Builder* childBuilder; public: //本例中,以下函数只是一个空壳,而标准的建造者模式 //其部件的组装过程是在以下两部函数中完成的! //建造一个成人超人 static SuperMan* getAdultSuperMan() { return adultBuilder->getSuperMan(); } //建造一个未成年人超人 static SuperMan* getChildSuperMan() { return childBuilder->getSuperMan(); } }; Builder* Director::adultBuilder = new AdultSuperManBuilder(); Builder* Director::childBuilder = new ChildSuperManBuilder(); int main() { //建造一个超人 SuperMan* sm = Director::getAdultSuperMan(); //SuperMan* sm = Director::getChildSuperMan(); //展示一个超人的能力 cout << "超人的身体:" << sm->getBody() << endl; cout << "超人的特殊能力:" << sm->getSpecialTalent() << endl; cout << "超人带的标志:" << sm->getSpecialSymbol() << endl; return 0; }; /*输出结果 超人的身体:强壮的躯体 超人的特殊能力:会飞行 超人带的标志:胸前带S标记 */
26.1.3 最佳实践
(1)意图不同
①工厂方法模式,关注的是一个产品整体,无须关心产品各部分是如何创建出来的。
②建造者模式,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”
③简单理解,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线程勾勒出一个复杂对象,关注的是产品组成部分的创建过程。
(2)产品的复杂度不同
①工厂方法模式创建的产品一般都是单一性质产品,都是一个模样。
②建造者模式创建的则是一个复合产品,它则各个部件复合而成,部件不同,产品对象当然不同。
③一般来说工厂方法模式创建的产品的粒度比较粗,而建造者模式的产品对象粒度比较细。
(3)方法的选择:如果关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5655196.html