(四)工厂方法模式详解(另附简单工厂的死亡之路) (三)

2014-11-24 10:41:11 · 作者: · 浏览: 2
eException("Can't register driver!");
}
}
} 可以看到,在类构造方法中,加入了registerDriver这个方法,所以当我们使用class.forName加载驱动的时候,将会把mysql驱动注册到DriverManager,这时DriverManager中就会持有Mysql驱动所必要的信息,我们就可以使用DriverManager来获得具体的mysql连接了,当然,你要提供url,用户名和密码。

原来我们都是活在温室里的花朵,都被这些设计者细心呵护着,生怕我们知道一点底层的东西。记得LZ当初第一次看到Class.forName时,还觉得真是个神奇的东西,没想到只是这些设计者给我们的糖外衣。

工厂方法模式的好处不言而喻了,而且适用的场景也不言而喻了。

好处就是,从类关系上来说,它可以让客户端与具体的工厂与产品解耦,从业务角度来说,它让客户端与具体的产品解耦。

适用的场景很简单咯,就是我们需要一个产品帮我们完成一项任务,但是这个产品有可能有很多品牌(像这里的mysql,oracle),为了保持我们对产品操作的一致性,我们就可能要用到工厂方法模式。

工厂方法模式也有它所不足的地方,可能你会说,这多好啊,我们操纵数据库不再需要关心具体是哪个数据库。是的,你很爽啊,那是因为这些产品的实现都不用你写啊,都是数据库厂商给你写的。

假设产品数量巨多,而且需要我们亲手去逐个实现的时候,工厂方法模式就会增加系统的复杂性,到处都是工厂类和产品类,而且这里所说的工厂类和产品类只是概念上的,真正的产品一般不可能两个类就能搞定,否则mysql和oracle的驱动包为啥要那么多类,而不是就一个Driver和一个Connection。

当然这也不是绝对,比如我们经常使用的HashSet和ArrayList,也是使用的工厂方法模式,各位看下他们的类图就看出来了。

\

各位可能会说,不对啊,这和我们刚才理解的不太一样啊,按照刚才的说法,我们不是应该直接使用iterable和iterator吗?这样多牛X,我们不依赖于具体产品了。对于这个LZ表示三条黑线垂下,sun或者说oracle为了集合框架给你提供了这么多具备各个特性的集合,你只用iterator和iterable,估计当初参与设计集合框架的人都要气的去shi了。。

上述这便是工厂方法模式另外一种用法了,刚才因为我们不关心真正的产品是什么,所以我们直接使用抽象接口操作。但是我们使用iterable和iterator的时候,我们是关心真正产品的特性的,所以为了使用产品的特性,我们就需要使用产品特有的接口了,比如特殊的SortedSet可排序,比如ArrayList可以有重复元素,可以根据索引获取元素等等。当然你依然是可以使用iterable和iterator的,但是不管你用什么,在这种场景下,产品是你自己选的,一句话,你随便。。。

两种使用方式一种是对使用者透明的,一种是不透明的,一种是使用者对具体的产品不关心,这种情况下,一般产品提供的功能是类似的。一种是使用者非常了解产品的特性,并想使用产品的特性,这种情况下,一般产品只提供最基本的一致的功能,但每个产品都会有自己独特的一面。

但是LZ个人觉得真正做项目的过程当中很少用到工厂方法模式,这个模式更多的是帮助我们理解现有的开源项目,就像现在,你是不是对数据库的大体框架有了一定认识了呢,如果你不知道这个模式,可能看源码会觉得一头雾水呢。

好了,工厂方法模式就给各位分享到这吧,感谢各位的欣赏。

下期预告,能不能取消这个预告。。。