这是第几次去回头再学习工厂方法了?应该是第4次了,关于之前学习工厂方法都是知道它解决了我们创建管理对象的问题,并且使用了这个工厂以后还能够支持扩充,符合了面向对象的思想。
但是为什么符合呢?
是因为配合着反射动态的添加class类就能够动态的创建对象。
这个是工厂方法中的工厂接口,
public interface IFactory {
Operation createOperation();
}
这个是实现工厂接口的实现类
public class DivFactory implements IFactory{
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
这个是被工厂创建的类型的父类
public abstract class Operation {
private double numberA = 0;
private double numberB = 0;
public abstract double GetResult() ;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
}
如果我们有其他的Operation的子类需要被加载到程序中那我们就需要创建对应的工厂子类,而添加的这个操作是符合开闭原则的。但是这几个操作都是有一定共性的添加类、编译类、加载到程序中,那么这些有共性的东西有规律的我们就可以交给机器去做。所以这次在工厂方法中的应用,我们只需要有对应的工厂接口即可,如果需要不同的类的对象,那么创建不同类型的工厂实现类即可,这里知道要去如何自动化?以及自动化帮助我们解决了哪些问题。
这是创建类的模板类,通过这个类去动态的创建相应的类,这里通过字符串拼接的形式进行拼接,后期可以更换为一个模板文件进行读取然后操作。
public class ClientTemplate {
public String createClient(String ClientName) throws IOException {
String srcFactoryCode = "package saomiao.client;\n" +
"\n"+
"import saomiao.operation."+ClientName+";\n" +
"import saomiao.Operation;\n" +
"import saomiao.OperationFactory;\n" +
"import saomiao.operationFactory."+ClientName+"Factory"+";\n" +
"public class "+ClientName+"Client{"+"\n"+
" "+"public static void main (String[] args) throws Exception{ "+"\n" +
" "+"OperationFactory operationFactory = new " +ClientName+"Factory();"+ "\n"+
" "+"Operation operate = operationFactory.createOperate();" +"\n"+
" "+"operate.setNumberA(11);"+"\n"+
" "+"operate.setNumberB(22);"+"\n"+
" "+"double result = operate.GetResult();"+"\n"+
" "+"System.out.println(result);"+"\n"+
" "+"}"+"\n"+
"}";
String srcFilePath = "D:\\only-java\\springbootDemo\\springDemo\\src\\main\\java\\saomiao\\client\\" + ClientName+"Client" + ".java";
FileWriter fileWriter = null;
File file = new File(srcFilePath);
if (!file.exists()) {
file.createNewFile();
}
fileWriter = new FileWriter(srcFilePath);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(srcFactoryCode);
bufferedWriter.close();
return srcFilePath;
}
}
浙公网安备 33010602011771号