工厂模式的精髓在于:
当需要不同的条件产生具有多态性质的一组类时,可以考虑使用factory类,来生成。
所以工厂模式的特征:
1.需要有一个抽象的基类。
2.需要用到一组子类,这些类需要相同的基类。
3.需要通过一个factory类的static方法产生这一组基类。
下面是一个计算器的例子:
UML图如下:
如上图:
1.计算器的操作是一组独立的数据操作。这些操作可以抽象为一个基类。
2.通过工厂类可以产生这些操作类,并且可以赋值给抽象基类。
工厂类:
package com.jayfulmath.designpattern.samplefactory.operator; public class OperatorFactory { public static AbstractOperator CreateOperator(String operatorstr) { AbstractOperator oper = null; switch(operatorstr) { case "+": oper = new OperatorAdd(); break; case "-": oper = new OperatorDelete(); break; case "*": oper = new OperatorPlus(); break; case "/": oper = new OperatorDevide(); break; case "squar": oper = new OperatorSquare(); break; } return oper; } }
package com.jayfulmath.designpattern.samplefactory.operator; public abstract class AbstractOperator { public double NumberA = 0; public double NumberB = 0; public abstract double GetResult(); }
add方法类:
package com.jayfulmath.designpattern.samplefactory.operator; public class OperatorAdd extends AbstractOperator { @Override public double GetResult() { // TODO Auto-generated method stub return (NumberA+NumberB); } }
main方法调用:
@Override public void startDemo() { //add AbstractOperator addop = OperatorFactory.CreateOperator("+"); addop.NumberA = 1; addop.NumberB = 2; System.out.println(addop.NumberA+" add "+addop.NumberB+" = "+addop.GetResult()); //squar AbstractOperator squarop = OperatorFactory.CreateOperator("squar"); squarop.NumberA = 1.2; System.out.println(addop.NumberA+" squar " +" = "+squarop.GetResult()); }
如上:通过工厂类方法:OperatorFactory.CreateOperator("+") 可以很快得到操作类和结果。
优点:工厂类方法便于扩展方法,对原有代码改动很小。
缺点:每次添加一个操作,工厂类就需要修改,这个对扩展开放,对修改也开放,违反了开放--关闭原则。
所以使用工厂方法替代,可以符合该原则。