您的位置:首页 > 其它

设计模式(二)工厂模式:1-简单工厂模式

2017-09-14 17:31 260 查看

模拟场景:

 

  现在有如下需求,需要构造一个运算器(Operation)去实现加减乘除的功能,怎么设计?

 

 

思想:

 

  所需要构造的对象是运算器(Operation),因为没有具体功能的运算器,是毫无作用的,所以可以将其定义为抽象类(Abstract Class)。

  需要有具体意义的构造器:加法运算器(OperationAdd),减法运算器(OperationSub),乘法运算器(OperationMul),除法运算器(OperationDiv)。

  根据工厂模式的思想,将这些构造器的创建工作,统一的管理起来,用一个工厂(OperationFactory)去创建。

 

 

UML:

 

  

1 public final class OperationFactory {
2
3     private static final Map<Class<?>, AbsOperation> operMap = new HashMap<>();
4
5     @SuppressWarnings("unchecked")
6     public static <T extends AbsOperation> T createOperation3(Class<T> operationClass) {
7         try {
8             T t;
9             if (operMap.containsKey(operationClass)) {
10                 t = (T) operMap.get(operationClass);
11             } else {
12                 t = operationClass.newInstance();
13                 operMap.put(operationClass, t);
14             }
15             return t;
16         } catch (InstantiationException | IllegalAccessException e) {
17             throw new ArithmeticException("未定义的运算类型");
18         }
19     }
20
21 }
OperationFactory  

  通过存储一个 Map,将已经创建过的对象,存储在 Map 中,在第二次调用方法时,直接从 Map 中获取对象,从而达到单例的目的。

 

 

总结:

  1.   简单工厂模式,由于其工厂对象是独立的,一般都是将其中创建对象的方法设置为 static,避免创建工厂对象,所以也被称为静态工厂模式(Static Factory Method).
  2.   由于方法是静态的,导致在实现单例时,代码有点不舒服,就是在需要将 Map 设计为 Class-AbsOperation 结构,导致在具体实现中,需要强转。
  3.   简单工厂模式最大的缺点在于,面对新增的类,例如阶乘运算器,不但需要新增一个运算器类,还要对 createOperation() 方法做出改变,这就违反了开闭原则。
  4.   这一点,在之后的工厂方法模式(Factory Method)中给出了解决方案。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: