设计模式基础(7):原型模式&构建器模式
包含原型模式&构建器模式两种模式中的C++示例代码、面向的问题、图解两种模式核心思想
原型模式
面向的需求
其应用场景也是为了避免new和主体部分紧耦合。主要是为了优化new一个新对象时太过于复杂,而利用拷贝构造技术进行效率优化的一种方案。
示例代码
1 2 3 4 5 6 7 8 9
| class ISplitter{ public: virtual void split()=0; virtual ISplitter* clone()=0; virtual ~ISplitter(){}
};
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class BinarySplitter : public ISplitter{ public: virtual ISplitter* clone(){ return new BinarySplitter(*this); } };
class TxtSplitter: public ISplitter{ public: virtual ISplitter* clone(){ return new TxtSplitter(*this); } };
class PictureSplitter: public ISplitter{ public: virtual ISplitter* clone(){ return new PictureSplitter(*this); } };
class VideoSplitter: public ISplitter{ public: virtual ISplitter* clone(){ return new VideoSplitter(*this); } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class MainForm : public Form { ISplitter* prototype;
public: MainForm(ISplitter* prototype){ this->prototype=prototype; } void Button1_Click(){ ISplitter * splitter= prototype->clone(); splitter->split(); } };
|
代码思想分析
对比工厂方法和原型模式。理解原型模式的意图。

关键点
- 主要思想还是保持主体部分的稳定,只是具体实现上,原型模式更适用于初始化复杂的对象类型。
构建器模式
面向的需求
在具体的类中,发现业务逻辑过于繁杂。可通过分析其变化与稳定部分,拆分为多个类进行构建。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| class House{ };
class HouseBuilder { public: House* GetResult(){ return pHouse; } virtual ~HouseBuilder(){} protected: House* pHouse; virtual void BuildPart1()=0; virtual void BuildPart2()=0; virtual void BuildPart3()=0; virtual void BuildPart4()=0; virtual void BuildPart5()=0; };
class StoneHouse: public House{ };
class StoneHouseBuilder: public HouseBuilder{ protected: virtual void BuildPart1(){ } virtual void BuildPart2(){ } virtual void BuildPart3(){ } virtual void BuildPart4(){ } virtual void BuildPart5(){ } };
class HouseDirector{ public: HouseBuilder* pHouseBuilder; HouseDirector(HouseBuilder* pHouseBuilder){ this->pHouseBuilder=pHouseBuilder; } House* Construct(){ pHouseBuilder->BuildPart1(); for (int i = 0; i < 4; i++){ pHouseBuilder->BuildPart2(); } bool flag=pHouseBuilder->BuildPart3(); if(flag){ pHouseBuilder->BuildPart4(); } pHouseBuilder->BuildPart5(); return pHouseBuilder->GetResult(); } };
|
代码思想分析

关键点
- 其主要面对的就是分步骤构建一个复杂的对象。要注意到“分步骤”是一个稳定的算法。而各个部分则经常变化。
- 将变化点进行封装,应对频繁的需求变动。