这是第几次去回头再学习工厂方法了?应该是第4次了,关于之前学习工厂方法都是知道它解决了我们创建管理对象的问题,并且使用了这个工厂以后还能够支持扩充,符合了面向对象的思想。
但是为什么符合呢?
是因为配合着反射动态的添加class类就能够动态的创建对象。
这个是工厂方法中的工厂接口,
1. public interface IFactory { 2. Operation createOperation(); 3. }
这个是实现工厂接口的实现类
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; } }
/