N天之后,终于看懂这个模式了...我发现我在没有学会1+1之前,先去玩儿1+2去了...
//工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类都实例化延迟到其子类
//之前一直没有理解这个模式为什么要这么做
//首先感受下没有用工厂方法模式的情况
public class ExportFileApi {
public boolean export(String data);
}
public class ExportTxtFile extends ExportFileApi {
public boolean export(String data) {
System.out.println("成功导出"+data+"到Txt文件");
return true;
}
}
public class ExportDbFile extends ExportFileApi {
public boolean export(String data) {
System.out.println("成功功导出"+data+"到Db文件");
return false;
}
}
public class Client {
public static void main(String[] args) {
ExportFileApi exp = new ExportTxtFile();
exp.export("测试数据");
}
}
//还是感觉没有用工厂方法模式挺好的...(之后又看了下书的开头有这样一句话:面向接口编程,系统外部不应该知道或了解具体实现(实现类))
//这样一看貌似理解了一点这个模式了
//======================================================
//再来看看用了工厂方法模式的情况
public abstract class ExportOperate {
public boolean export(String data) {
ExportFileApi api = factoryMethod();
return api.export(data);
}
protected abstract ExportFileApi factoryMethod();
}
//这里用到了抽象类,至于原因,应该是书中的这句话吧(1.优先使用接口,2.当只需要定义子类都行为时用接口,又要为子类提供公共的功能时用抽象类)
//很明显export方法就是子类的公共方法(应该就是这个意思吧)
public class ExportTxtFileOperate extends ExportOperate {
protected ExportFileApi factoryMethod() {
return new ExportTxtFile();
}
}
public class ExportDbFileOperate extends ExportOperate {
protected ExportFileApi factoryMethod() {
return new ExportDbFile();
}
}
public class Client {
public static void main(String[] args) {
ExportOperate operate = new ExportDbFileOperate();
operate.export("测试数据");
}
}
//这下再看客户端(即系统外部),实例化的只是一个操作对象,而不是具体都实现对象了
//一步一步按照一些原则用自己的思路和方法实现了一下,经过一次次抽象,最终跟上边都工厂方法很相似
//感觉工厂方法模式应用应该非常广泛
//本来到此可以结束了,再次看看看参数化工厂方法,突然蒙了
public class ExportOperate {
public boolean export(int type,String data) {
ExportFileApi api = factoryMethod(type);
return api.export(data);
}
protected ExportFileApi factoryMethod(int type) {
ExportFileApi api = null;
if(type==1) {
api = new ExportTxtFile();
}else if(type==2) {
api = new ExportDbFile();
}
return api;
}
}
public class Client {
public static void main(String[] args) {
ExportOperate operate = new ExportOperate();
operate.export(1,"测试数据");
}
}
//我在自己实现都时候用到了这种方法,可是一味得去理解面向接口编程,结果觉得这样是面向对象编程方法不好...
//没想到这种方法美其名曰 参数化工厂方法
//到这里突然又理解类工厂方法模式的本质---把具体实现延迟到子类当中,这样的话以上这两种方法都可以理解了
//另外,工厂方法模式很好地体现类“依赖倒置原则”,依赖---要依赖抽象,不要依赖于具体类
//倒置---接口的所有权倒置到高层组件中去了,因为是高层组件提出的接口需求
//感觉这三个月的工作假期太值了,在厦门大学这样一个非常有学习氛围的地方跟学生们一起学习
//只有离开了学校才知道学校的好,真的,在学校真好,好想回到从前
//让我能够把以前在学校没有好好学的知识多多少少补回来一些,很幸运,很感激