欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单工厂模式

程序员文章站 2024-01-19 19:19:22
...

简单工厂模式概述

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

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

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

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

总结

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

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