本文主要是介绍《研磨设计模式》chap6 工厂模式factory(2)案例实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 用工厂模式实现案例
public interface ExportFileApi {//导出内容成为文件 public boolean export(String data);
}public class ExportDB implements ExportFileApi{public boolean export(String data) { }
}public class ExportTxt implements ExportFileApi{public boolean export(String data) { }
}//实现导出数据的业务功能对象
public abstract class ExportOperate {//导出文件 public boolean export(String data){//使用工厂方法ExportFileApi api = factoryMethod();return api.export(data);}//工厂方法,创建导出的文件对象的接口对象 protected abstract ExportFileApi factoryMethod();
}public class ExportDBOperate extends ExportOperate{protected ExportFileApi factoryMethod() {//创建导出成数据库备份文件形式的对象return new ExportDB();}
}public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod() {//创建导出成文本文件格式的对象return new ExportTxtFile();}
}public static void main(String[] args) {//创建需要使用的Creator对象ExportOperate operate = new ExportDBOperate();//调用输出数据的功能方法operate.export("测试数据");}
2. IoC/DI
IoC——InversionofControl, 控制反转
DI——DependencyInjection, 依赖注入
public class A { private C c = null;//等待被注入进来 //注入资源C的方法 public void setC(C c){this.c = c;}public void t1(){//这里需要使用C类,可是又不让主动去创建C了,怎么办?//反正就要求从外部注入,这样更省心,//自己不用管怎么获取C,直接使用就好了c.tc();}
}
优化为:
public abstract class A1 {//工厂方法,创建C1,类似于从子类注入进来的途径 protected abstract C1 createC1();public void t1(){//这里需要使用C1类,可是不知道究竟是用哪一个,也就不主动去创建C1了,怎么办?//反正会在子类里面实现,这样更省心,这里不用管怎么获取C1,直接使用就好了createC1().tc();}
}public class A2 extends A1 {protected C1 createC1() {//真正的选择具体实现,并创建对象return new C2();}
}
3. 平行的类层次
4. 参数化工厂
依赖倒置原则告诉我们“要依赖抽象, 不要依赖于具体类”, 简单点说就是: 不能让高层组件依赖于低层组件, 而且不管高层组件还是低层组件, 都应该依赖于抽象。
eg. ExportOperate 提供type参数,假设要新增加一个xml文件输出类,增加type ==3.
public interface ExportFileApi {//导出内容成为文件 public boolean export(String data);
}public class ExportDB implements ExportFileApi{public boolean export(String data) {//简单示意一下,这里需要操作数据库和文件System.out.println("导出数据"+data+"到数据库备份文件");return true;}
}public class ExportTxtFile implements ExportFileApi{public boolean export(String data) {//简单示意一下,这里需要操作文件System.out.println("导出数据"+data+"到文本文件");return true;}
}public class ExportXml implements ExportFileApi{public boolean export(String data) {//简单示意一下System.out.println("导出数据"+data+"到XML文件");return true;}
}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 ExportDB();}return api;}
}public class ExportOperate2 extends ExportOperate{//覆盖父类的工厂方法,创建导出的文件对象的接口对象 protected ExportFileApi factoryMethod(int type){ExportFileApi api = null;//可以全部覆盖,也可以选择自己感兴趣的覆盖,//这里只想添加自己新的实现,其他的不管if(type==3){api = new ExportXml();}else{//其他的还是让父类来实现api = super.factoryMethod(type); }return api; }
}public static void main(String[] args) {
// //创建需要使用的Creator对象
// ExportOperate operate = new ExportOperate();
// //调用输出数据的功能方法,传入选择到处类型的参数
// operate.export(1,"测试数据");//创建需要使用的Creator对象ExportOperate operate = new ExportOperate2();//下面变换传入的参数来测试参数化工厂方法operate.export(1,"Test1");operate.export(2,"Test2");operate.export(3,"Test3");}
5. 总结
工厂方法模式的本质:延迟到子类来选择实现。
这篇关于《研磨设计模式》chap6 工厂模式factory(2)案例实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!