`
thaIm
  • 浏览: 90397 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

工厂模式

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

二)简单工厂模式
    先来看看一段丑陋的匹萨店订购匹萨的代码吧:

    那么为了提高代码的共用性和将orderPizza()对修改关闭。显然我们可以将阴影部分提炼出来。

    提炼后,我们的代码将会是这样:

    当然更多情况simplePizzaFactory的createPizza()将会用静态方法来实现,因为这样代码使用起来相对会更简单。
    好了,这便是简单工厂模式了。是很简单吧。但现实世界往往比这个例子复杂的多,比如匹萨的类型成千上百,再比如我们这次需要创建的不只是一个匹萨,而是一系列原料的组合集。这些情况如何应对?工厂方法模式和抽象工厂模式对此很有一套,一起来看看吧~~

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



    上图中只以纽约分店和芝加哥分店为例以作示范。而他们的父类PizzaStore的改变则如下图:



    好了,一切准备就绪,是时候看看如何运行我们的代码了:



四)抽象工厂模式
    在简单工厂模式的基础上,当我们的实例化种类变多时,我们演化出了工厂方法模式加以解决。那么如果问题向另一个方向发展呢?当我们需要实例化的不止是一个匹萨而是一组匹萨的原料呢?抽象工厂模式就很好的解决了这个问题。
    仍以匹萨店为例,假设一组的匹萨原料如下:



    那么其中的一组实现(纽约店原料)可以是:



    再来看看我们的父类Pizza, 注意prepare();已经被修改为抽象函数了咯:



    基于父类Pizza, 我们在Pizza实现类中可以这样使用抽象工厂



    当然,相应的纽约匹萨店也要稍作修改:



   好了,一切准备就绪。用户使用(运行)我们的代码订购匹萨的方式完全不变。只是我们对于原料的控制更加有力灵活了!这便是抽象工厂模式的威力。
  • 大小: 72.1 KB
  • 大小: 76.1 KB
  • 大小: 73.9 KB
  • 大小: 143.6 KB
  • 大小: 67.8 KB
  • 大小: 53.4 KB
  • 大小: 48.6 KB
  • 大小: 96.7 KB
  • 大小: 84.6 KB
  • 大小: 64.5 KB
  • 大小: 103 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics