c++设计模式之建造者模式 学习笔记

学习建造者模式的时候,总觉的似曾相识,不自禁的联想到(抽象)工厂方法模式/模板方法模式/桥接模式… …在埋怨自己没有把这些模式吃透的情况下同时又有点小激动——不知不觉已经学了这么多模式了

下面开始介绍建造者模式。
首先,按照自己的理解先把联想到的这几个设计模式简单的再理一理:
(抽象)工厂方法模式:不同的产品由该类的生成厂家负责产出,强调产品分类和各司其职,便于类后续扩展管理。
模板方法模式:将流程封装,每一流程的具体方法可以改变,最终组合起来实现不同的目的。强调流程的一致性和方法的多样性。
桥接模式:通过类之间的聚合或组合关系来代替继承,便于类之间的自由组合,产出不同类型的产品。强调自由组合搭配,生成出不同的东西。
然后,举个建造者的例子。你可能会感觉,建造者模式好似是结合了上述设计模式的一些不同特点的产物。
随便举一个,因为我戴眼镜,就比如眼镜吧:有眼睛框,眼睛腿,鼻托和镜片构成。(有的都是一体的,暂且不论,假设就是这几部分而且是分离的)。你去配眼镜,有眼镜店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封装流程)/桥接模式(眼镜配件互相组合搭配)的思想?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值