这段文字最初是回复水木上一个mm的问题,问为什么要用工厂,整理之后,发到这里来。

工厂模式是创建模式,封装对象的创建过程。对象的创建最简单的方式是new出来,但是有一些情况下用new来创建对象会导致代码难以维护。

实例来了,说我们为什么要用工厂。在某系统中要用到一个DataSource对象。而且用的很广泛。在盘古开辟天地的时期,要获取一个DataSource对象,是这么干的:

1 DataSource ds = new DataSourceImpl("dburl","user","password");


在很多地方写了这样的代码之后,你的团队里面的另外一个人开始与你合作做这个项目。这位仁兄拿到代码之后发现,你写在代码中一共20个地方的new DataSourceImpl("dburl","user","password")里面的数据库url,username和password和他的机器上的情况不符合,于是导致他的机器上应用跑不起来。

于是你发现,这样做有问题。

于是你创建了一个新类,叫做DataSourceManager。干什么呢,专门来创建DataSource.

 1 
 2 public class DataSourceManager{
 3 
 4     public DataSource getDataSource(){
 5 
 6         return new DataSourceImpl("dburl","user","password");
 7 
 8     }
 9 
10 }


其实这个DataSourceManager已经是一个简单的工厂了。说他简单,是因为他的创建逻辑简单。

经过上面的改造,你的同事拿到代码之后高兴了,发现自己只要把这个DataSourceManager里面的代码改一改,在自己机器上就能跑起来了。于是他请你吃了哈根达斯——当然,不排除这是因为他想追你。

又过了两天,恭喜你项目越做越大,团队又加入了2个人。你们决定要使用版本控制工具来管理代码。当大家都开始从svn拿最新的代码的时候,你发现每天都会拿到新的DataSourceManager,里面变化的是各个团队成员自己机器上的数据库url,用户名,密码。而这些变化对于项目进展来说是无效的,于是你希望大家不要提交这个类。之后很快你会发现这不是最好的方法,因为每到一个新的环境,你改了DataSourceManager里面的代码,都需要编译相关的类,才能使用。

于是你发挥聪明才智,把数据库用户名密码放在了一个properties配置文件中。暂且叫做jdbc.properties。然后经过改造,DataSourceManager变成了下面的样子:

 1 public class DataSourceManager{
 2 
 3    private String dbUrl;
 4 
 5    private String user;
 6 
 7    private String password;
 8 
 9    static{
10 
11        //读取jdbc.properties,初始化dburl,user,password
12 
13    }
14 
15    public DataSource getDataSource(){
16 
17        return new DataSourceImpl(dbUrl,user,password);
18 
19    }
20 
21 }


恭喜你,经过这样的改造,DataSourceManager封装了更多的创建逻辑,而你在不同的机器上部署应用的时候也不需要总是去编译了。

过了几天,领导对你说,现在用jdbc直接连数据库可能会有性能问题,我们希望使用jndi,使用容器管理的数据源,但是同样要给开发人员保持使用jdbc连接的余地。

于是你再一次的修改DataSourceManager,根据一个配置,决定是去jndi中取dataSource直接返回,还是根据用户密码url来创建dataSource返回。

回首往事,你将会心潮澎湃。想像一下当初如果没有用DataSourceManager这么个东西来封装DataSource的创建过程,而是坚持在系统的各个角落创建DataSource的话,现在要改成jndi方式得费多大劲。于是一高兴,你请当初请你吃哈根达斯的那个男生吃了顿饭。可惜的是他错误的理解了你的意思,以为你对他有某方面的好感。

再后来的某一天,你有幸读到了和banq吵架很火爆的阎宏博士写的《Java与模式》,发现你所写的DataSourceManager就是他书中阐述的工厂模式——因为其职责是封装对象的创建过程。正好赶上陈水扁在台湾给各名胜改名去掉中国字眼,号称叫做正名,于是你为你的DataSourceManager也正了一下名,改叫做DataSourceFactory。

至此,你终于理解了工厂模式是干什么的,以及他为什么这么重要。

后若干岁月,你开始研究开源世界里面大大小小的轮子,某一天发现了Spring这么个东西,之后又惊奇的发现,这个东西的核心内容,竟然就是一个BeanFactory——也就一工厂。于是你融会贯通,高兴之余,拒绝了那个男生对你的求爱,告诉他说你现在只对工厂感兴趣,对男人没兴趣。