工厂模式——简单工厂模式SimpleFactory

                                        简单工厂模式

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);
	}

}

运行结果样例:

发布了53 篇原创文章 · 获赞 3 · 访问量 3500

猜你喜欢

转载自blog.csdn.net/sinat_38292108/article/details/89359033