简单工厂模式
1.介绍:
1.1工厂模式可以分为三类:简单工厂模式,工厂方法模式,抽象工厂模式。
1.2简单工厂模式又称静态工厂方法模式,其存在的目的是:定义一个用于创建对象的接口。
1.2.1组成:
1)工厂类角色:一般由具体类实现。可以理解对具体产品类的管理。
2)抽象产品类角色:一般由接口或抽象类实现。是具体产品类继承的父类或实现的接口。
3)具体产品类:一般由具体类实现。该类的实例为工厂类创建的对象。
1.2.2特点:
简单工厂模式不满足开放封闭原则(扩展开放,修改封闭);如果要实现的功能很多,或者存在多层次关系,很明显只有一个工厂类,不利于修改。
2.示例:
计算器控制台程序,输入两个数和运算符号,得到结果。
分析:计算器的功能就是计算获得结果,具体来看有加减乘除。
使用简单工厂模式可以灵活的添加其他计算功能,如三角函数,开方等等;只需要添加相应的类,并增加工厂类中的判断逻辑。
当然下面代码暂时只实现了两个操作数的计算问题。(解决思路一:再编写一个接口用于处理一个操作数的情况)
package 设计模式;
/*
* 简单工厂类:抽象产品(接口或者抽象类),具体产品(具体类),工厂类(具体类)返回产品类型
* 运行时只要初始化工厂类,结果给抽象产品类,再调用
* 开放封闭原则(对扩展封闭,对修改封闭)
* */
/*
* 抽象产品:Operation类,方法:获得计算结果
* 具体产品:加减乘除类
* 工厂类:Calculator类
*
*/
import java.util.Scanner;
interface Operation{
public double getResult(double leftOperand,double rightOperand,String opString);
}
class Add implements Operation{
public Add() {
}
public double getResult(double leftOperand,double rightOperand,String opString) {
double result=0;
result=leftOperand+rightOperand;
return result;
}
}
class Sub implements Operation{
public Sub() {
}
@Override
public double getResult(double leftOperand, double rightOperand, String opString) {
// TODO Auto-generated method stub
double result=0;
result=leftOperand-rightOperand;
return result;
}
}
class Mul implements Operation{
public Mul() {
// TODO Auto-generated constructor stub
}
@Override
public double getResult(double leftOperand, double rightOperand, String opString) {
// TODO Auto-generated method stub
double result=0;
result=leftOperand*rightOperand;
return result;
}
}
class Div implements Operation{
public Div() {
}
@Override
public double getResult(double leftOperand, double rightOperand, String opString) {
// TODO Auto-generated method stub
double result=0;
if(rightOperand!=0)
result=leftOperand/rightOperand;
else {
System.out.println("除数不能为0!");
}
return result;
}
}
class Calculator{
public Calculator() {
super();
// TODO Auto-generated constructor stub
}
public static Operation calculate(double leftOperand, double rightOperand, String opString) {
switch (opString) {
case "+":
return new Add();
case "-":
return new Sub();
case "*":
return new Mul();
case "/":
return new Div();
}
return null;
}
}
public class SimpleFactory {
public static void main(String[] args) {
// TODO Auto-generated method stub
//获取操作数与操作符
System.out.println("请在一行里输入操作数(实数)和运算符(+,-,*,/),用空格隔开:");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
String[] strInput=string.split(" ");
double leftOperand=Double.parseDouble(strInput[0]);
double rightOperand=Double.parseDouble(strInput[1]);
String opString=strInput[2];
//计算结果
Calculator calculator=new Calculator();
Operation operation=calculator.calculate(leftOperand,rightOperand,opString );
double result=operation.getResult(leftOperand, rightOperand, opString);//返回的是子类的方法!!
System.out.println(strInput[0]+strInput[2]+strInput[1]+"="+result);
}
}