xhliu 的个人资料青蛙王子的工作空间照片日志列表 工具 帮助

日志


12月20日

设计模式:工厂和原型

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++里面的拷贝构造函数。同一个一个原型实现一个新的实例,必须要注意把原型拷贝到新的实例里面的操作。
 

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://flyingfrog1980.spaces.live.com/blog/cns!515A924507F2FEA5!135.trak
引用此项的网络日志