1:工厂(Factory Method)
首先,工厂这个名字取得很好,就像前面说的,创建型模式的意义在于把生成一个变量从手工作坊(new,delete)的方式变化到工业化的模式,那么这里的工业化模式最典型的就是工厂(Factory Method)。工厂自己也是一个类,也会生成实例,工厂的功能就是为了创建另外一些变量。举例子,我们有奔驰车,宝马车,马拉车等等。现在我们要为他们生成变量,手工作坊和工业化的区别如下:
1) 手工作坊
MyCar = new 奔驰。
显然,如果有一天,你需要了一个新的车,叫宝马, 就需要把程序里面所有的
MyCar = new 奔驰换成
MyCar = new 宝马。这样实在太麻烦了。
2) Factory方式
首先我们需要一个factory的实例 Factory = new 轿车工厂
那么我们需要奔驰车的时候就是用 MyCar = Factory.CreateCar() //这里的Factory 是奔驰车的工厂
我们需要宝马的时候就用 MyCar = Factory.CreateCar() //这里的Factory 是宝马的工厂
看,不许要修改那么多了吧?这个就是Factory模式的好处。
3) 缺点。
可惜,Factory模式并不能一点都不修改,他需要修改一部分,就是Factory自己的创建
当从Factory = new 轿车工厂 创建一个工厂的时候,必须要指定是哪个工厂。比如下面的例子
class 轿车工厂
{
}
class 宝马轿车工厂:public 轿车工厂
{
}
class 奔驰轿车工厂:public 轿车工厂
{
}
那么,当你想从宝马车换到本车车的时候,就必须有下面的变迁:
Factory = new 宝马轿车工厂 ==> Factory = new 奔驰轿车工厂
2: 原型 (Prototype)
工厂模式还是有局限性的,比如轿车,我们需要的轿车可能会越来越多:奔驰,宝马,法拉利,A,B,C,D。。。。。可能有好几百种。采用工厂模式,我们必须给每一种车辆设计一个他的工厂,这个会生成好几百个类!!!!!!!
然而,我们其实并不需要声明这么多的类,因为好多工厂都是类似的。比如上面的几百个例子中,有几个这样的例子:宝马1型,宝马2型,宝马3型,宝马4型,宝马5型,宝马6型。虽然他们的差别很小,但是Factory模式必须为他们每一个生成一个类!显然,我们可以用下面的方式来生成几个类:宝马原形, 然后 宝马1型= 宝马原形(发动机1),宝马1型= 宝马原形(发动机2)。。。
这就是原型模式!
原型模式的存在价值就是减少 Factory模式的类的种类。
原型模式有以下几点注意事项:
1) 原型能大大减少类的数目,但是并不会把上面轿车几百种变成一种,所以我们需要一个原型管理器。用associative store的方式保存,可以注册,删除,引用一个原型。这种管理器也可以是一个扩展的singleton对象,这点就有点类似Abstract Factory了,但是功能不一样。
2) 克隆操作。也就是c++里面的拷贝构造函数。同一个一个原型实现一个新的实例,必须要注意把原型拷贝到新的实例里面的操作。