简单的工厂模式:通过加载传入的字符串,返回所需特定的实现类创建的对象
接口Operation及其各种的实现类
package zx.simplefactorypattern.test1;
public interface Operation {
public double getResult(double number1,double number2) throws Exception;
// public abstract double getResult(double... number1) throws Exception;
}
class OperationAdd implements Operation{
@Override
public double getResult(double number1, double number2) {
double result=0;
return result=number1+number2;
}
}
class OperationSub implements Operation{
@Override
public double getResult(double number1, double number2) {
double result=0;
return result=number1-number2;
}
}
class OperationMul implements Operation{
@Override
public double getResult(double number1, double number2) {
double result=0;
return result=number1*number2;
}
}
class OperationDiv implements Operation{
@Override
public double getResult(double number1, double number2) throws Exception {
double result=0;
if(number2==0){
throw new Exception("除数不能为0");
}
result=number1/number2;
return result;
}
}
对象工厂
package zx.simplefactorypattern.test1;
public class OperationFactory {
public static Operation createOperation(String operate){
Operation opera=null;
switch(operate){
case "+": opera=new OperationAdd(); break;
case "-": opera=new OperationSub(); break;
case "*": opera=new OperationMul(); break;
case "/": opera=new OperationDiv(); break;
}
return opera;
}
}
测试
package zx.simplefactorypattern.test1;
public class Test1 {
public static void main(String[] args) throws Exception {
Operation operationAdd = new OperationFactory().createOperation("+");
Operation operationSub = new OperationFactory().createOperation("-");
Operation operationMul = new OperationFactory().createOperation("*");
Operation operationDiv = new OperationFactory().createOperation("/");
double n1=123;
double n2=0;
System.out.println(operationAdd.getResult(n1, n2));
System.out.println(operationSub.getResult(n1, n2));
System.out.println(operationMul.getResult(n1, n2));
System.out.println(operationDiv.getResult(n1, n2));
}
}
通过简单工厂模式加载以ini结尾的配置文件
/*
工厂设计模式就是用于产生对象的。
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
Person p = (Person) getInstance();
System.out.println(p);
}
//需求: 编写一个简单工厂根据配置文件中对应类名返回对应的对象。
public static Object getInstance() throws Exception{
//读取配置文件
BufferedReader bufferedReader = new BufferedReader(new FileReader("f:/info.txt"));
//读取第一行 : 读取类文件的信息
String className = bufferedReader.readLine();
//通过完整类名获取对应 的Class对象
Class clazz = Class.forName(className);
//获取到对应的构造方法
Constructor constructor = clazz.getDeclaredConstructor(null);
constructor.setAccessible(true);
Object o = constructor.newInstance(null);
//给对象设置对应的属性值
String line = null;
while((line = bufferedReader.readLine())!=null){
String[] datas = line.split("=");
Field field =clazz.getDeclaredField(datas[0]);
//设置可以访问
field.setAccessible(true);
if(field.getType()==int.class){
field.set(o, Integer.parseInt(datas[1]));
}else{
field.set(o, datas[1]);
}
}
return o;
}
}
info.txt
reflect.Person
id=110
name=旺财
适用于哪些场景
1.工厂类负责创建的对象比较少;
2.客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
3.由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。