技术开发 频道

GOF设计模式 --- 工厂模式

    隐喻是一种明智的学习方法。世界上很多深奥的理论都是用隐喻来理解消化的。这是今天早晨看代码大全第一章的感触。

一.抛花引狼,用些生活常识理解一下工厂模式

    那么学习工厂模式,就先来谈谈工厂。什么是工厂呢?这个好像还不应该由我来下定义。我们只需要想一想工厂是什么样的。生活中有很多个工厂。服装制造工厂,汽车制造工厂,等等。都是用来生产产品的。每个工厂都有自己的生产线,销售处等等。

    下面结合着头脑中工厂的概念,来认识一下GoF设计模式中的工厂模式。

    工厂就用来生产产品的。在我们程序设计过程中,每一个对象的创建,就象是一个产品的诞生。创建一个对象,是为了提供给一个使用者使用的,就象生产一个产品是为了提供给一个消费者使用一样。

    我们无时无刻不在调用着new()方法,就象Car car = new Car();然后,一个Car的对象car产生了。这个过程中,我们调用了Car的构造器来产生对象。这样看来,好像并不需要工厂模式来为我们做什么啊?我们再进一步分析一下。现实生活中要买车,不会简简单单的new Car()这样做。至少,我们要明确,买什么类型的车啊?买哪个厂家制造的车啊?买什么价位的车啊?买什么颜色的车啊等等。也许这些,你也可以由Car的构造器通过参数传递来实现。那么再比如,如果价位低于x就买A类型的车,如果价位高于x就买B类型的车。这样也许也可以由构造器进行一次逻辑判断来实现......这样,我们不难发现,问题越复杂的时候,我们的构造器也会变得越来越复杂。这样明显违背了面向对象的封装(Encapsulation)和分派(Delegation)。我们应该将代码分派成一段一段,将每一段再“封装”起来。这样,形成松藕合的状态,以后如果需要修改,只要更改每一段,而不会牵一动百。

    那么,我们应该怎么做呢?其实上面的例子已经潜在的告诉我们该怎么做了。我的原则始终是,面向对象,一切从现实中的理论出发,很多都符合生活常识。现实中一个Car是如何产生的呢?这是废话!当然是是由工厂制造出来的。如果只提到工厂,那么很显然,这个名词是抽象的。我们看不到到底是哪家工厂。这样就出现了另一个概念---抽象工厂。我们先不去仔细的理解什么是抽象工厂。还是先研究从现实的角度去看,一个Car是如何被生产的。首先有一个具体的汽车制造工厂。这个汽车制造工厂具有一般工厂都具有的特性。特殊的,它是生产汽车的,也就是在它的内部存在汽车的生产线。同时,工厂里还置有汽车的销售处。用来对工厂外的消费者进行交易的。这样,就产生了几个相应的部门(模块)。

    说了半天的废话,让我们先来看个例子。

//我们的工厂 class CarFactory { //这个接口想像成工厂对外的销售处 public static Car creator(int type) { //这里就来到了汽车的生产线 if (type == 1) return new Car(); else if (type == 2) return new Car2(); } }

    如果还没有理解为什么要这样写,而不是都封装到Car的构造器里,那就硬记下来吧。因为以后随着项目的深入,对CarFactory的扩张会越来越多。到时候就会体会到这样写的好处了。因为偶也是初次学习。^.^!

    所以,以后涉及到一个对象创建的时候,就要考虑一下,是否需要应用一下工厂模式。特别是,对于某些类,类的创建就是类的主要功能。

0
相关文章