简单工厂模式(Simple Factory Pattern):简单工厂模式又可以称为静态工厂方法模式,是属于类创建型模式。简单工厂模式可以根据参数的不同来返回不同类的实例对象。 简单工厂模式可以理解为专门定义一个工厂类来负责其他类实例的创建。而被工厂类创建的实例一般来说是有着相同的父类这一共性。而用来创建实例对象的方法一般是静态(static)方法,因此才被称为静态工厂方法。
优点: (1)、在工厂类中封装了关于逻辑的判断,不同类的实例在何时创建是由工厂类来决定的,避免了客户端直接创建实例。 (2)、客户端在创建类的实例对象时,无需知道类的类名,只需要向工厂类中传入参数即可。 (3)、也无需引入其余的配置文件,可以在补修改客户端代码的情况下就可以维护或者拓展新的产品类,只需要完成相关类的继承、重写以及工厂类代码的修改即可。 缺点: (1)、在工厂类中集合了所有产品的创建的逻辑,职责重大,一旦工厂类出现问题,整个系统或许会受到影响。 (2)、系统扩展困难,如果增加新的产品就要修改工厂类的逻辑,当产品的类型较多时,可能会使逻辑过于复杂。 (3)、简单工厂模式使用的是静态(static)工厂方法,就会造成工厂角色无法形成基于继承的等级结构。 (4)、使用简单工厂模式会增加系统中类的个数(引入新的工厂类),会增加系统的复杂度和理解难度。 适用环境: (1)、由工厂类创建的对象比较少,因为不会造成工厂方法中的逻辑混乱。 (2)、客户端只只知道传入工厂类的参数,对于如何创建对象不关心。
此案例由大话设计模式的第一章案例而来。 使用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,根据输入的数和符号完成关于符号的计算,最后得到结果。
代码实现: 操作类,所有计算方法的父类 abstract class Operation { private double numberA = 0; private double numberB = 0; //编写抽象方法,获取计算结果 public abstract double GetResult(); public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } } // 继承Operation父类,并重写父类中的获取加法计算结果的方法 class OperationAdd extends Operation{ @Override public double GetResult() { return getNumberA()+getNumberB(); } } // 继承Operation父类,并重写父类中的获取减法计算结果的方法 class OperationSub extends Operation{ @Override public double GetResult() { return getNumberA()-getNumberB(); } } //继承Operation父类,并重写父类中的获取乘法计算结果的方法 class OperationMul extends Operation{ @Override public double GetResult() { return getNumberA()*getNumberB(); } } // 继承Operation父类,并重写父类中的获取除法计算结果的方法,并对除0抛出异常 class OperationDiv extends Operation{ @Override public double GetResult() { double result=0; try { result=getNumberA()/getNumberB(); }catch (Exception e){ e.printStackTrace(); } return result; } } //工厂类,用于根据传来的参数计算 类的实例 class OperateFactory { public static Operation createOperation(String operate){ Operation oper=null; switch (operate){ case "+":oper=new OperationAdd();break; case "-":oper=new OperationSub();break; case "*":oper=new OperationMul();break; case "/":oper=new OperationDiv();break; } return oper; } } //主函数,也算客户端代码,向工厂类传递参数完成指定类型的计算。 public class Program { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print("请输入操作符(+、-、*、/):"); String operate=sc.next(); System.out.print("请输入数字A:"); double numberA=sc.nextDouble(); System.out.print("请输入数字B:"); double numberB=sc.nextDouble(); Operation oper=OperateFactory.createOperation(operate); oper.setNumberA(numberA); oper.setNumberB(numberB); System.out.println("计算结果为:"+oper.GetResult()); } }OperateFactory:工厂类,负责类的对象实例化的内部逻辑。其中的创建实例 的方法为静态方法,可以被直接调用。 Operation:计算类,是一个抽象类,简单工厂模式所创建的所有对象类的父类,包含所有实例所共有的公共接口。 OperationAdd、OperationSub、OperationMul、OperationDiv:具体的计算类,简单工厂模式创建的实体类。
