工厂模式

[b]一)工厂模式简介[/b]
工厂模式是我们用于创建对象时所使用的模式。它大致可细分为三种:简单工厂模式(因为通常是使用静态函数实现该模式,所以又名静态工厂模式)、工厂方法模式以及抽象工厂模式。简单工厂模式顾名思义,其非常简单。简单到人们甚至开始讨论它还能不能算是一种设计模式。也许我们称其为一种编程习惯更为合适。但不管怎样,它是工厂方法模式和抽象工厂模式的基础。在简单工厂模式的基础上,当问题向两个不同的方向发展变得复杂时,才派生出了工厂方法模式和抽象工厂模式。
话不多说,让我们现在就从简单工厂模式开始...

[b]二)简单工厂模式[/b]
先来看看一段丑陋的匹萨店订购匹萨的代码吧:
[img]http://dl.iteye.com/upload/attachment/0063/7951/b8887729-6538-3e37-8fc7-ae435b1e1347.jpg[/img]
那么为了提高代码的共用性和将orderPizza()对修改关闭。显然我们可以将阴影部分提炼出来。
[img]http://dl.iteye.com/upload/attachment/0063/7955/c54ad5e0-ba74-3422-9af8-730ac7d2be13.jpg[/img]
提炼后,我们的代码将会是这样:
[img]http://dl.iteye.com/upload/attachment/0063/7957/36f1c832-2fb3-3071-81f4-a6a6aef3462e.jpg[/img]
当然更多情况simplePizzaFactory的createPizza()将会用静态方法来实现,因为这样代码使用起来相对会更简单。
好了,这便是简单工厂模式了。是很简单吧。但现实世界往往比这个例子复杂的多,比如匹萨的类型成千上百,再比如我们这次需要创建的不只是一个匹萨,而是一系列原料的组合集。这些情况如何应对?工厂方法模式和抽象工厂模式对此很有一套,一起来看看吧~~

[b]三)工厂方法模式[/b]
现在让我们假设情况更复杂一点也更符合实际一点:我们匹萨店的匹萨种类不止以上例子中的四个,而是四十个甚至是四百个。我们该怎么办?我们当然可以仍然用简单工厂模式,就这样一直增加几百个 ...else if () .... 。但显然,这不再是一种可行的至少是好的方法了。我们要对这成百种匹萨进行科学的归类,以使每一类内的匹萨种类数量在一个可接受的范围内。以避免当他人打开我们的程序,看到我们的实例化匹萨代码时,直接就被这些不可思议的...else if()...所吓死。 这其实就是工厂方法模式所做的事情。 仍以匹萨店为例,我们的分类策略不妨就以分店为单位,每个分店的匹萨为一类,我们为每一类匹萨单独对应一个对象。具体的类图如下:
[img]http://dl.iteye.com/upload/attachment/0064/0285/5f9e0cd2-7072-3b2d-bff2-5b67dddefc3e.jpg[/img]


上图中只以纽约分店和芝加哥分店为例以作示范。而他们的父类PizzaStore的改变则如下图:
[img]http://dl.iteye.com/upload/attachment/0064/0289/6375bc43-06f0-3da6-8ca5-4ff6fd940e2e.jpg[/img]


好了,一切准备就绪,是时候看看如何运行我们的代码了:
[img]http://dl.iteye.com/upload/attachment/0064/0292/0de82cda-b437-3bed-aa83-5874732355c1.jpg[/img]


[b]四)抽象工厂模式[/b]
在简单工厂模式的基础上,当我们的实例化种类变多时,我们演化出了工厂方法模式加以解决。那么如果问题向另一个方向发展呢?当我们需要实例化的不止是[b]一个[/b]匹萨而是[b]一组[/b]匹萨的原料呢?抽象工厂模式就很好的解决了这个问题。
仍以匹萨店为例,假设[b]一组[/b]的匹萨原料如下:
[img]http://dl.iteye.com/upload/attachment/0064/0296/c3487e2d-fd01-328e-8576-6be2283de21e.jpg[/img]


那么其中的一组实现(纽约店原料)可以是:
[img]http://dl.iteye.com/upload/attachment/0064/0299/3da1c0b3-e113-3da8-80bc-733718cc9fc4.jpg[/img]


再来看看我们的父类Pizza, 注意prepare();已经被修改为抽象函数了咯:
[img]http://dl.iteye.com/upload/attachment/0064/0301/31aa481e-a30b-3041-ab22-35ebcfbae96c.jpg[/img]


基于父类Pizza, 我们在Pizza实现类中可以这样使用[b]抽象工厂[/b]:
[img]http://dl.iteye.com/upload/attachment/0064/0303/1859451c-a81b-337b-b93e-152d75410702.jpg[/img]


当然,相应的纽约匹萨店也要稍作修改:
[img]http://dl.iteye.com/upload/attachment/0064/0306/b9853b53-df00-3b88-97d8-1f2694d741d6.jpg[/img]


好了,一切准备就绪。用户使用(运行)我们的代码订购匹萨的方式完全不变。只是我们对于原料的控制更加有力灵活了!这便是抽象工厂模式的威力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值