`
阅读更多
这段文字最初是回复水木上一个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——也就一工厂。于是你融会贯通,高兴之余,拒绝了那个男生对你的求爱,告诉他说你现在只对工厂感兴趣,对男人没兴趣。

分享到:
评论
1 楼 kedunling 2009-12-28  
牛人啊,学习

相关推荐

    Python设计模式-工厂模式

    工厂模式有三种模式: 简单工厂模式:定义一个创建对象接口,通过参数来决定创建哪个类的实例 工厂方法模式:定义一个创建对象接口,让子类来决定创建哪个类的实例,工厂方法使一个类的实例化延迟到到其子类中 抽象...

    abc.rar_ABC_三层

    c#版本的三层工厂模式示例源码,适合初学c#者下载学习。

    python常见的设计模式(详解)

    2,简单工厂模式 3,工厂方法模式 4,抽象工厂模式(解决多类产品) 1,单例模式(只能创建一个对象) 1、单例模式介绍 内容:保证一个类只有一个实例,并提供一个访问他的全局访问点 使用场景:当类只能有一个实例...

    吉林大学软件学院卓班设计模式第二次作业

    为此,重新设计了CharPic(为方便对比,类名改为Pic),希望通过子类型化和共享来避免abc中的问题。类的结构图(部分)如下: 其中,由于子类型化的存在,字符图像的拷贝采用了原型方法模式 (即虚拟拷贝构造函数);...

    煤炭工程管理中物资采购成本控制的方法

    论述了物资采购管理过程中的成本控制对整个煤炭工程项目管理体系影响的重要性以及传统的ABC分析法与实际相结合的两种采购模式,重点介绍了多年采购实践中总结并实施的有效采购模式和一些节约、控制成本的举措。

    editplus 代码编辑器html c++ jsp css

    希望每次遇到“abc”,则替换“abc”以及其后到行尾的内容为“abc efg” 即上面的文本最终替换为: abc efg 123 abc efg 解决: ① 在替换对话框,查找内容里输入“abc.*” ② 同时勾选“正则表达式”复选框,然后...

    公司简易通讯录程序 v2015.zip

    公司简易通讯录程序原创软件,工厂、公司、企业通讯录软件,方便办公人员随时查询内部人员联系方式。 公司简易通讯录程序使用方法: 在公司一台电脑上安装SQL2005,设置IP地址为192.168.0.200,sql验证方式为sql...

    软件工程-理论与实践(许家珆)习题答案

    而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的花费大量人力、财力, 而在开发过程中就夭折。软件危机主要表现在两个方面: (1) ...

    design_patterns

    状态定义一组具有定义顺序的状态 :light_bulb: 战略将函数(策略)作为参数传递给另一种方法 :ledger: 模板方法ABC类,抽象了不同类之间共有的方法 :person_running: 游客允许您浏览数据结构的元素创作模式它们是...

    java版多用户商城源码-android_engineer:一份android工程师的简历模板

    java版多用户商城源码 联系方式 手机:1380013800 Email: 微信号:Haegyeong 个人信息 陈小琼/男/1994 学校:xxx学院/计算机应用技术专业 ...项目使用MVP模式作架构 配合Rxjava+retrofit+OkHttp作为项目的数据传输

    封口橡胶制品的过程失效模式及影响分析 (2015年)

    以某橡胶公司生产的封口橡胶制品为研究对象,运用ABC分类法,找出造成产品质量问题的关键项;运用过程失效模式及影响分析法,分析改善前后关键项的风险顺序数,发现运用该技术可以在一定程度上控制质量问题的出现,...

    手机解锁秘诀-再也不用上营业厅了

     *#0324# 网络检测(工程模式) 4 e: Q# j- ~/ Y4 ~* z& d  *#0364# 显示Watchdog状态,可以修改 0 u7 [# E9 P# i: i2 y *#0377# EEPROM错误显示 % p" P$ S* O9 O5 j5 j% A *#0427# WATCHDOG信号路径设置 . ['...

    oracle数据库经典题目

    在Oracle数据库中,数据库的操作模式分为专用服务器(DELICATED SERVER)模式和多线程服务器(MULTITHREADED SERVER)模式两种。其中,在专用服务器模式中为每个用户进程创建一个服务器进程,用户进程与服务器进程之间...

    java面试题

    但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。 113 84.8. 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一...

    数据库系统原理A.pdf

    R A B C a b c d a f c b d S A B C b g A d a F 山东海天软件工程专修学院模拟试卷 《数据库系统原理》A试卷 1、 单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目...

    究竟什么是“软件定义汽车”

    这两年,关于汽车软件的讨论越来越多。“软件定义汽车”的说法也被行业内的人们屡屡提起,每个人都在说软件将要重新定义汽车,并视特斯拉为先驱。有两个说法比较流行:一是新四化的浪潮下,...它通过从供应商ABC处购买

    最新Java面试宝典pdf版

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java面试宝典2010版

    说明工厂模式。 3、开发中都用到了那些设计模式?用在什么场合? 九. j2ee部分 1、BS与CS的联系与区别。 2、应用服务器与WEB SERVER的区别? 3、应用服务器有那些? 4、J2EE是什么? 5、J2EE是技术还是平台还是...

    Java面试笔试资料大全

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

Global site tag (gtag.js) - Google Analytics