意图
用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象
来源
- 原型模式可以由工厂方法演化而来
- 具体讲就是将抽象基类
Product和Creator合并,并将FactoryMethod改为clone方法
代码示例
1 2 3 4 5 6 7 8 9 10
| class MainForm : public Form { ISplitter *prototype; public: MainForm(SplitterFactory *sf) : sf(sf) {} void Button_Click(){ ISplitter * splitter = prototype->clone(); splitter->split(); } };
|
1 2 3 4 5 6 7
| class ISplitter{ protected: ISplitter(){} ~ISplitter() {} virtual void split() = 0; virtual ISplitter * clone() = 0; };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class BinarySplitter : public ISplitter{ public: void split() override; ISplitter * clone() override(){ return new BinarySplitter(); } };
class ImageSplitter : public ISplitter{ public: void split() override; ISplitter * clone() override(){ return new ImageSplitter(); } };
|
- 注意客户程序中不能直接通过
prototype调用split方法
总结
类图
适用性
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当要实例化的类实在运行时指定时。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化该类更方便些。