一:为什么用工厂模式
文件IO的操作我们会经常用得到吧,所以BufferedReader对象经常要创建的:
// 创建一个BufferedReader对象
BufferedReader bf = new BufferedReader(new FileReader(new File("aa.txt")));
你说麻烦吗?其实也不麻烦,就一行代码嘛,哪里麻烦了~如果不太熟悉IO流的同学就没有那么机灵了,创建一个BufferedReader可能就是以下的代码了:
File file = new File("aa.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
你说麻烦吗?其实也不麻烦,不就是三行代码嘛,哪里麻烦了~如果这个应用很多的类上都用到了BufferedReader对象的话,那每个类都写上这三行代码了。那你说麻烦吗?那肯定麻烦啊,还用想啊….
可以看出来,创建一个BufferReader对象里面需要一个FileReader对象,而FileReader对象又要File对象。那创建这个BufferReader对象还是比较麻烦的(代码上看不麻烦,从构造上看还是挺麻烦的)!
虽然比较麻烦,但我们还能用,能用就行!于是乎,我们就去写代码了,现在有三个类都要进行文件的读写操作,于是他们就有这样的代码:
public class FileOperateA {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("aa.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
// 读写文件....
}
}
此时:上头说,我要换成LineNumberReader来读写,有这个需求!那我们作为一个写代码的,能怎么办?很绝望也需要去完成呀。
-
不熟悉IDE的小伙子就一个一个将BufferedReader改成LineNumberReader,现在就3个类用到了BufferedReader,也就改6次而已。(ps:那如果很多地方都用到了呢?)
-
熟悉IDE的小伙子就全局替换重构,妥妥的!
哎,写个代码屁事真多…那有没有一种方法能够让创建对象变得简单而且修改对象时能很方便呢?
-
哎,工厂模式就行了。
再说从面向对象的角度来看:我一个操作文件的类还要我会创建BufferReader是不是有点过分了?(职责没有分工好)
-
交给工厂来创建对象这就很面向对象了!
二:体验工厂模式
何为工厂?将我们的产品都交由工厂来生产!我现在用的iphone5s,从哪来?从富士康组装而来,富士康是工厂。我用得着知道iphone5s在富士康是怎么组装起来的吗?不需要。
来,我们来改造一下上面的例子。首先我们创建一个工厂类,它可以生产Reader对象!
// 创建Reader对象的工厂
public class ReaderFactory {
public static Reader getReader() throws FileNotFoundException {
File file = new File("aa.txt");
FileReader fileReader = new FileReader(file);
BufferedReader reader = new BufferedReader(fileReader);
return reader;
}
}
那么我们要得到BufferReader对象就贼简单了:
public class FileOperateA {
public static void main(String[] args) throws FileNotFoundException {
//-------我有工厂了,还用自己搞吗?不用了!
//File file = new File("aa.txt");
//FileReader fileReader = new FileReader(file);
//BufferedReader bufferedReader = new BufferedReader(fileReader);
//-------我有工厂了,还用自己搞吗?不用了!
// 用工厂来创建出对象
Reader reader = ReaderFactory.getReader();
// 读写文件....
}
}
工厂将我们创建的对象过程给屏蔽了!
此时我要改成LineNumberReader怎么玩?在工厂上改一下就好