简单工厂模式

独自空忆成欢 提交于 2020-04-02 09:31:33

简单工厂模式概述

当我们需要根据不同的逻辑创建不同的运算逻辑,而这些逻辑又是同属一个种类下的,此时就可以将判断逻辑放入一个类中,由该类提供入口参数,调用不同的逻辑对象返回相对应的结果。

以下我们就以一个简单的计算器作为例子

不使用工厂模式的实现方法

public class TestMain {
    public static void main(String[] args) {
        String operator;
        int firNum = 1;
        int secNum = 2;
        //加法
        operator = "+";
        if("+".equals(operator)) {
            System.out.println(firNum + secNum);
        } else if("-".equals(operator)) {
            System.out.println(firNum - secNum);
        } else if("*".equals(operator)) {
            System.out.println(firNum * secNum);
        } else if("/".equals(operator)) {
           if(secNum != 0) 
                System.out.println(firNum / secNum);
        } else {
            System.out.println(0);
        }
    }
}

将每个实现逻辑都写在一个类中,使得该类的职责过于繁重,而这就导致需要修改的时候,可能因为一个小错误就会导致当前类的失效或不可用,所以我们将每个运算逻辑单独取出作为一个类,并将客户端的逻辑提取到一个单独类中进行管理。

定义每个运算逻辑(一个运算逻辑是一个类)

//运算方法接口
interface Operator {
	public int getResult(int number1, int number2);
}

//各个运算方法类
//加法
public class Addition implements Operator{
	public int getResult(int number1, int number2) {
		return number1 + number2;
	}
}

//减法
public class Subtraction implements Operator{
	public int getResult(int number1, int number2) {
		return number1 - number2;
	}
}

//乘法
public class Multiplication implements Operator {
	public int getResult(int number1, int number2) {
		return number1 * number2;
	}
}

//除法
public class Divition implements Operator {
	public int getResult(int number1, int number2) {
		return number1 / number2;
	}
}

//两个变量求平均数
public class AverageTwo implements Operator {
	public int getResult(int number1, int number2) {
		return (number1 + number2) / 2;
	}
}

使用简单工厂模式的实现方法

//负责操作的工厂类
public class OperatorFactory {
	private String sign;
	private int number1;
	private int number2;
	private Operator operator = null;
	
	public void calculateParam(int number1, int number2, String sign) {
		this.number1 = number1;
		this.number2 = number2;
		this.sign = sign;
	}
	public int getResult() {
		if("+".equals(sign)) {
		    //加法运算
			operator = new Addition();
		} else if("-".equals(sign)) {
		    //减法运算
			operator = new Subtraction();
		} else if("*".equals(sign)) {
		    //乘法运算
			operator = new Multiplication();
		} else if("/".equals(sign)) {
		    //除法运算
			operator = new Divition();
		} else if("average".equals(sign)){
			operator = new AverageTwo();
		} else {
			return 0;
		}
		return operator.getResult(number1, number2);
	}
}

//测试函数
public class TestMain {
	public static void main(String[] args) {
	    //此时客户端就只需要传入参与运算的值及操作方法即可
		OperatorFactory operatorFactory = new OperatorFactory();
		operatorFactory.calculateParam(5, 2, "average");
		System.out.println(operatorFactory.getResult());
	}
}

总结

使用了简单工厂模式之后,在业务较为简单的情况下,当我们需要增加一个新的运算逻辑时,只需要再新增一个类,且在工厂类中增加对应的判断入口即可。
但是简单工厂模式违背了开闭原则,在我们新增运算逻辑时,仍需修改原类。这个问题在我们下次的工厂方法模式抽象工厂模式中会有所优化。

才疏学浅,如文中有错误,感谢大家指出。 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!