什么是简单工厂模式:
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。
使用场景:
- 需要根据不同的Type处理不同的逻辑的地方,都可以使用(如直播中同一个消息有不同的消息类型,需要创建不同的处理方式等);
- 取代if-else(也就是effective java里面说的标签类,充满各种的if-else),当需求更改时,需要更改if-else里面的内容,扩展性差,而简单工厂模式,把处理方式抽象成接口,工厂内部处理切换逻辑,更改时只需加上case和新类即可,不修改原来的逻辑;
引用
Effective 第四章 类与接口
类层次优于标签类
举例说明:
需要做一个计算器,实现加减乘除的算法
以下是简单工厂模式点实现
public class FactoryDesign {
public Operation createOperation(Operator operator) {// 这里可以优化成泛型或者Android里面的@IntDef
Operation operation = null;
switch (operator) {
case ADD:
operation = new AddOperation();
break;
case SUB:
operation = new SubOperation();
break;
case MUL:
operation = new MulOperation();
break;
case DIV:
operation = new DivOperation();
break;
}
return operation;
}
public enum Operator {
ADD,
SUB,
MUL,
DIV;
}
}
项目中的应用:
- 直播中消息列表:一条消息不同的Type对应不同的处理逻辑和样式(警告,聊天,全局广播,礼物.....)
- 开启游戏:一个GameID对应不同的游戏fragment
- 消息推送,不同的消息类型做不同的处理(打开App首页,跳转H5,跳转个人主页)
使用方法:
- 创建公共接口,提取各实例的通用处理方法;
- 创建各实例继承该接口,实现各自的处理逻辑;
- 创建工厂类,提供创建实例的方法,客户端传入类型参数,工厂类根据具体的类型创建不同的实例;
优点:
- 需要增加新的类型只需要增加新的实例类即可,工厂封装了具体的实现细节,逻辑清晰
- 责任分离,符合单一职责原则,后期扩展性强;
缺点:
- 工厂类的职责过大,每次增加新的类型需要修改工厂类,不符合开闭原则(对扩展开放,对修改关闭)
- 当类型较多时,工厂类泛滥,难以管理(可以用抽象工厂解决)