这段文字最初是回复水木上一个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——也就一工厂。于是你融会贯通,高兴之余,拒绝了那个男生对你的求爱,告诉他说你现在只对工厂感兴趣,对男人没兴趣。
分享到:
相关推荐
Java工厂方法模式 Java工厂方法模式是一种创建型模式,它属于类的创建型模式。该模式的主要思想是,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。这样做的目的是将类的实例化操作延迟到子类中完成...
9. **设计模式**:单例、工厂、观察者等设计模式是Java编程中的常见实践,能够提高代码的可维护性和复用性。 10. **JVM原理**:理解Java虚拟机的工作机制,包括类加载、内存管理、垃圾回收等,对于优化代码性能有...
在ABC算法中,模拟了蜜蜂寻找花粉源的行为模式。算法主要由三个主要角色组成:工蜂(Worker Bees)、侦查蜂(Scout Bees)和巢穴(Honeycombs)。工蜂负责在当前已知的解决方案(花粉源)中搜索改进,侦查蜂则探索新...
工厂模式有三种模式: 简单工厂模式:定义一个创建对象接口,通过参数来决定创建哪个类的实例 工厂方法模式:定义一个创建对象接口,让子类来决定创建哪个类的实例,工厂方法使一个类的实例化延迟到到其子类中 抽象...
4. **模板类和设计模式**:可能应用了设计模式如工厂模式,用于创建不同类型的窗体,或者使用观察者模式实现事件驱动编程。 5. **资源管理**:包括对内存、文件、数据库等资源的高效管理,确保程序的稳定性和性能。...
ABC算法在解决优化问题时表现出良好的全局搜索能力和鲁棒性,被广泛应用于工程、科学计算以及机器学习等领域。 在MATLAB环境中实现ABC算法,通常会涉及以下几个关键步骤: 1. 初始化:模拟蜜蜂群体,设定工蜂、...
通过工厂模式,可以在不指定具体实现的情况下创建对象,这样在更换数据库供应商或更改数据访问策略时,只需要修改工厂类,而不需要改动其他层的代码。 “ThreeTierTest.BLL”目录则包含业务逻辑层的代码。这一层...
标题中的"abc.zip_ABC_abc model_neural"表明这是一个与神经网络模型相关的压缩文件,其中“abc”可能是项目或模型的标识符,“ABC”可能是特定的模型版本或分类,而“neural”直接指出了是关于神经网络的内容。...
在Visual C++中,.clw 文件通常用来存储类视图信息,帮助开发者跟踪和管理工程中的类及其关系。 2. AbcView.cpp 和 Abc.cpp:这两个文件很可能是主程序的实现部分。AbcView.cpp 可能负责数据的展示,即用户界面的...
标题中的"abc.rar_ABC"可能是指一个名为"abc"的RAR压缩文件,后缀"_ABC"可能是某种标识或版本号。描述中提到的是一个演示工程,它的主要功能是将应用程序最小化到系统托盘区域。这通常涉及到Windows操作系统中的编程...
这个算法受到了蜜蜂寻找食物源的行为启发,通过模拟蜜蜂群体中的信息交流和行为模式来解决优化问题。在本案例中,ABC算法被应用于图像处理领域,特别是针对火焰图像的处理。 ABC算法的核心概念包括工蜂、侦察蜂和巢...
这个实验是为电子工程、嵌入式系统或者物联网(IoT)开发者设计的,旨在帮助他们理解和掌握如何在小型彩色液晶屏幕上呈现数字信息。以下是对这个主题的详细讲解: 1. **TFT彩屏**: TFT(Thin Film Transistor)彩色...
ABC算法以其简单易实现、收敛速度快、适应性强等特点,在解决复杂优化问题上展现出了较高的潜力,被广泛应用于工程、经济、生物信息学等多个领域。 在ABC算法中,每个解决方案对应一个蜜源位置,工蜂负责评估蜜源的...
人工蜂群算法(Artificial Bee Colony,简称ABC算法)是一种基于生物智能的优化算法,源自蜜蜂寻找花粉源的行为模式。这个算法由土耳其科学家Karaboga在2005年首次提出,它模拟了蜜蜂群体在寻找食物源过程中的三个...
9. **设计模式**:设计模式是软件开发中的最佳实践,如单例模式、工厂模式、装饰者模式、观察者模式等。面试中会考察对这些模式的理解以及在实际项目中的应用。 "abc.doc"文档可能包含了上述各个领域的具体面试题目...