原型模式是一种不太常见的创建型模式,我们平时的工作中几乎不会遇到这种模式,但是在一些框架设计中会用到,这里我们只做了解即可。它解决的也是对象创建时的问题,如果从代码层面上来看,它可以看作是工厂方法的一种巧妙的变化。
原型模式的定义:是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。(说白了就是调用对象的拷贝构造函数来创建一个新的对象)
既然上面说到它是工厂方法的一种巧妙的变化,后面的例子我还是以前面工厂方法中提到的不同家电厂商和其建造工厂的例子来说明。虽然可能会不太恰当....
UML结构图如下:
下面我用伪码来表述上面的例子。
//既然说到用工厂方法的例子,这里我就把工厂方法中用到的品牌抽象基类和工厂抽象基类拿过来,并扩充
//品牌基类
class Brand
{
public:
Brand() {}
virtual ~Brand() {}
virtual void name()=0;//返回品牌的名字
};
//工厂基类
class BrandFactory
{
public:
virtual ~BrandFactory() {}
virtual Brand *Create()=0;//创建对应品牌的产品
};
//然后把这两个抽象基类合并成一个,类名还是用Brand,并把那个Create方法改成原型模式中的Clone
class Brand
{
public:
Brand() {}
virtual ~Brand() {}
virtual Brand *Clone()=0;//创建对应品牌的产品
virtual void name()=0;//返回品牌的名字
};
//那么具体的品牌类该怎么写了?
class Midea : public Brand
{
public:
Midea() {}//构造函数
~Midea() {}//析构函数
//拷贝构造函数(一定要写!!!)
Midea(const Midea &other)
{
//....
}
//克隆,其实调用拷贝构造函数
virtual Brand* Clone()
{
return new Midea(*this);
}
};
//应用
int main()
{
Brand *pB = new Midea();
Brand *pClone1 = pB->Clone();//克隆了一个美的
Brand *pClone2 = pB->Clone();//又克隆了一个
return 0;
}
现在返回那张UML图我们再来看
结合到我们的例子和原型模式的定义,其中稳定的部分就是我们的品牌类。变化的是从品牌基类继承下来的各种子类。在实际应用中原型模式的实现比我例子中要复杂的多,也增加了一些其他的技巧。对于我们普通开发者来说了解它的原理即可。
最后,如果理解的有偏差,还请指出!