1.简单工厂
uml类图:
简单工厂使类创建对象时更灵活,但是不符合开闭原则
2.工厂模式
uml类图:
工厂模式虽然符合了开闭原则,但是却丧失了原本的灵活性需求
3.抽象工厂
uml类图:
抽象工厂可以处理两种完全无关的产品,但是它既不符合开闭原则又没有灵活性,所以需要用简单工厂进行改进
改进后:
它具有了简单工厂的灵活性,但是由于使用了switch case进行判断,所以还是不符合开闭原则,所以可以继续改进,使用反射技术代替switch判断
以下是一个计算类的简单工厂使用反射改变后的代码:
简单工厂类:
public class OperationFactory {
public static Operation createOperation(String operate) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException{
String name = new Config("configA.properties").outValue(operate);
Class<?> operateClass = Class.forName(name);
Class<?> addOperation = Class.forName("AddOperation");
Object o = operateClass.newInstance();
return (Operation) o;
}
}
运算类:
public class Operation {
int num1;
int num2;
public void setNum1(int num1) {
this.num1 = num1;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public double getResult(){
return 1;
}
}
加法类和减法类,继承运算类:
public class AddOperation extends Operation{
@Override
public double getResult(){
return (num1+num2);
}
}
public class SubOperation extends Operation{
@Override
public double getResult(){
int num1 = super.num1;
int num2 = super.num2;
return (num1-num2);
}
}
配置文件类:
重要:负责反射技术使用的配置部分
public class Config {
String propertiesName;
public Config(String propertiesName){
this.propertiesName=propertiesName;
}
//在配置文件中写入键值对
public void inData(String key,String value,String comments) throws IOException{
//创建properties对象,以用于写入配置文件
Properties props=new Properties();
FileOutputStream oFile = new FileOutputStream(propertiesName,true);
props.setProperty(key, value);
props.store(oFile,comments);
oFile.close();
}
//读取配置文件中的键值对
public String outValue(String key) throws IOException{
Properties props=new Properties();
FileInputStream iFile=new FileInputStream(propertiesName);
props.load(iFile);
iFile.close();
return props.getProperty(key);
}
}
主函数(客户端):
public class Main {
public static void main(String[] args) throws Exception {
//初始化配置文件
Config config = new Config("configA.properties");
config.inData("+", "AddOperation","add");
config.inData("-", "SubOperation","sub");
//接受用户输入信息
Scanner scan = new Scanner(System.in);
System.out.println("请输入运算数A");
String num1 = scan.next();
System.out.println("请输入运算数B");
String num2 = scan.next();
System.out.println("请输入运算符");
String operate = scan.next();
//根据用户输入信息,创建具体运算对象
Operation oper = OperationFactory.createOperation(operate);
//传入具体数字
oper.setNum1(Integer.parseInt(num1));
oper.setNum2(Integer.parseInt(num2));
//输出结果
System.out.println(oper.getResult());
}
}