Spring中使用到的设计模式(三)----简单工厂模式

1. 简单工厂模式

1.1 什么是简单工厂模式

实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。

1.2 UML图

Spring中使用到的设计模式(三)----简单工厂模式

1.3 优缺点

优点:我们可以对创建的对象进行一些 “加工” ,而且客户端并不知道,因为工厂隐藏了这些细节。如果,没有工厂的话,那我们是不是就得自己在客户端上写这些代码,这就好比本来可以在工厂里生产的东西,拿来自己手工制作,不仅麻烦以后还不好维护。

缺点:如果需要在方法里写很多与对象创建有关的业务代码,而且需要的创建的对象还不少的话,我们要在这个简单工厂类里编写很多个方法,每个方法里都得写很多相应的业务代码,而每次增加子类或者删除子类对象的创建都需要打开这简单工厂类来进行修改。这会导致这个简单工厂类很庞大臃肿、耦合性高,而且增加、删除某个子类对象的创建都需要打开简单工厂类来进行修改代码也违反了开-闭原则

2. 简单工厂模式的代码实现

/**

 * 公共操作抽象类

 */

public interface Operation {

public double getResult(double numberA,double numberB) throws Exception;

}

/**

 * 加法计算实现类

 */

public class Add implements Operation{

@Override

public double getResult(double numberA, double numberB) throws Exception {

return numberA + numberB;

}

}

/**

 * 减法计算实现类

 */

public class Sub implements Operation{

@Override

public double getResult(double numberA, double numberB) throws Exception {

return numberA-numberB;

}

}

/**

* 乘法计算实现类

*/

public class Mul implements Operation{

@Override

public double getResult(double numberA, double numberB) throws Exception {

return numberA * numberB;

}

}

/**

* 除法计算实现类

*/

public class Div implements Operation{

@Override

public double getResult(double numberA, double numberB) throws Exception {

if (numberB == 0) {

            throw new Exception("除数不能为0!");

        }

        return numberA / numberB;

}

}

/**

 *  简单工厂,根据字符串创建相应的对象

 */

public class OperateFactory {

    public static Operation createOperation(String name) {

        Operation operationObj = null;

        switch (name) {

            case "+":

                operationObj = new Add();

                break;

            case "-":

                operationObj = new Sub();

                break;

            case "*":

                operationObj = new Mul();

                break;

            case "/":

                operationObj = new Div();

                break;

        }

        return operationObj;

    }

}

/**

 *  测试主类

 */

public class MainTest {

public static void main(String[] args) throws Exception {

        Operation add = OperateFactory.createOperation("+");

        Operation sub = OperateFactory.createOperation("-");

        Operation mul = OperateFactory.createOperation("*");

        Operation div = OperateFactory.createOperation("/");

    }

}