定义
定义一个工厂类,它可以根据传入参数的不同来对不同的产品类进行实例化。被创建的产品类通常具有共同的父类。
设计模块通常如下几部分:
- 抽象产品类(或者接口):通常为将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中(产品类中提取出来公共业务方法)
- 具体产品类:创建不同的产品
- 工厂类:根据传入的产品参数的不同,来实例化对应的产品类
应用场景
- 客户端不知道它要创建的具体是哪一个子类。
- 一个类想要由自己的子类来定义某对象的创建过程。
- 类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化
-
a.简单工厂模式所创建的对象往往属于一个产品等级。
b.创建的对象比较少。
简单的计算器实例
业务的封装,让业务逻辑与界面逻辑分开,让他们之间的耦合度下降。只有分离开,才可以打开容易维护和扩展。
假设客户端
import operate.Operation;
import java.util.Scanner;
/*
* 假设客户端
* */
public class SimpleFactoryMain {
public static void main(String[] args){
try{
Operation ope;
Scanner sc = new Scanner(System.in);
System.out.println("输入第一个数:");
double num1=sc.nextInt();
System.out.println("输入运算符:");
String operate = sc.next();
ope=OperationFactory.createOperation(operate);
System.out.println("输入第二个数:");
double num2 = sc.nextInt();
ope.setNum1(num1);
ope.setNum2(num2);
double result = ope.GetResult();
System.out.println("结果是:"+result);
}catch (Exception e){
System.out.print("你输入的有误:"+e.getMessage());
}
}
}
Operation运算类(父类)
package operate;
/*
* 运算父类
* */
public class Operation {
private double num1;
private double num2;
public double getNum1() {
return num1;
}
public void setNum1(double num1) {
this.num1 = num1;
}
public double getNum2() {
return num2;
}
public void setNum2(double num2) {
this.num2 = num2;
}
public double GetResult() throws Exception {
double result=0;
return result;
}
}
其他运算继承运算父类(松耦合:继承与多态)
1.加法运算
package operate;
/*
* 加法运算
* */
public class OperationAdd extends Operation {
@Override
public double GetResult(){
double result=getNum1()+getNum2();
return result;
}
}
2.减法运算
package operate;
/*
* 减法运算
* */
public class OperationSub extends Operation {
@Override
public double GetResult() {
return getNum1()-getNum2();
}
}
3.乘法运算
package operate;
/*
* 乘法运算
* */
public class OperationMul extends Operation {
@Override
public double GetResult() {
return getNum1()*getNum2();
}
}
4.除法运算
package operate;
/*
* 除法运算
* */
public class OperationDiv extends Operation {
@Override
public double GetResult() throws Exception {
if(getNum2()==0){
throw new Exception("除数不能为0");
}
return getNum1()/getNum2();
}
}
运算工厂类
import operate.*;
/*
* 简单工厂类
* */
public class OperationFactory {
public static Operation createOperation(String operate){
Operation ope=null;
switch (operate){
case "+":ope = new OperationAdd();break;
case "-":ope=new OperationSub();break;
case "*":ope=new OperationMul();break;
case "/":ope=new OperationDiv();break;
}
return ope;
}
}