• 简单工厂模式


    简单工厂模式概述

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

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

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

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

    总结

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

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

  • 相关阅读:
    JAVA-初步认识-第十二章-多线程创建方式一继承
    JAVA-初步认识-第十二章-主线程运行示例
    JAVA-初步认识-第十二章-JVM中的多线程分析
    JAVA-初步认识-第十二章-面向对象(Jar包)
    JAVA-初步认识-第十二章-面向对象(导入import)
    ecstore-kvcache里表结构
    ecstore-app接口
    ecstore与淘宝sdk的autoload加载顺序问题
    正则匹配<{$vcode}>变量
    电子面单纸打印时固定高度18cm,到底是多少px
  • 原文地址:https://www.cnblogs.com/runningRookie/p/11108777.html
Copyright © 2020-2023  润新知