设计模式--简单工厂模式

设计模式系列链接:
设计模式–面向对象编程的六大设计原则

学习设计模式一定要记住:设计模式的最大作用是降低代码耦合,减少项目需求变化所造成的影响 , 或者提升代码合并/移植的效率。

简单工厂模式简介

简单工厂模式,又叫静态工厂方法模式, 它的基本结构如下:

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个工厂类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。从而降低代码耦合度。

使用场景举例

比如,刚开始的时候, 我们只学习了加法,也就只会用到加法, 那创建一个加法就行了:

 Add add = new Add();
 int result = add.addOperation(6,3);//加法计算6+3

过了一天, 我们又学会了减法, 老师说:把昨天书上的题用减法算一遍,于是用橡皮擦把昨天写的擦干净:

Sub sub = new Sub();
int result = sub.subOperation(6,3);//减法计算6+3

又过了一天, 我们又学会了乘法计算,老实说昨天的题用乘法算一遍,于是橡皮擦把昨天的擦干净, 重新写到:

Multi multi = new Multi();
int result = multi.MultiOperation(6,3);

又过了一天,又学会了除法、幂运算、指数运算、对数运算。。。天天擦, 好累哦,,,可不可以简单一点呢,每次我们就发出一个计算指令就行了?

于是简单工厂模式来了,我们把所有的加减乘除运算类都继承自IOption这一个抽象运算类,这个抽象类包含一个运算方法 每次调用运算即可,首先看看抽象类和工厂类:

public abstract class IOperation {
    /**
     * 抽象运算, 每个子类运算方法去具体实现
     */
    public abstract int getResult(int object1, int object2);
}

,

public class SimpleFactory {

private static final int ADD = 1;//加法标记
private static final int SUB = 2;//减法标记
private static final int MULTI = 3;//乘法标记
private static final int DIV = 4;//除法标记


public static IOperation createOperation(int code) {
    IOperation operation = null;
    switch (code) {
    case ADD:
        operation = new OperationAdd();
        break;
    case SUB:
        operation = new OperationSub();
        break;
    case MULTI:
        operation = new OperationMulti();
        break;
    case DIV:
        operation = new OperationDev();
        break;
    }

    return operation;
}

然后运算的时候调用一下:

IOperation ope = SimpleFactory.create(SimpleFactory.ADD);//使用加法运算
//真正计算这一步抽象出来了,完全不用管到底是加法还是减法,都这么调用
int result = ope.getResult(6,3);

这样,如果老师再让我们修改这道题的计算方式, 我们只需要将code替换一下,比如SimpleFactory.ADD替换为SimpleFactory.SUB即可,减少了修改。同时,将运算这一步抽象了出来,减少了代码的耦合,不用去管具体是什么算法,都是调用ope.getResult(6,3)来进行计算。这里也用到了代码六大设计原则中的依赖倒转原则, 也就是抽象不依赖细节, 细节应该依赖抽象。

这就体现了java开发的特性:封装、继承、多态, 我们实际开发时, 也是这样, 如果太多代码直接依赖细节,没有抽象和封装, 一旦需求变化,要修改时,就需要该一大片的代码。

简单工厂模式的优点

  • 和名字一样, 简单工厂模式使用简单,达到的效果也很好,开发中经常用得到
  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个具体产品类的实例,客户端可以免除直接创建某个具体产品对象的责任,而仅仅使用产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

    • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可(比如使用加法则传入:ADD, 减法则传入SUB),对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换Y要使用产品类,在一定程度上提高了系统的灵活性。比如调用工厂类创建实例时, 如果传入的参数是通过一个xml文件去读取的,而xml文件可以通过本地配置或者网络传输,则我们可以灵活的控制代码创建哪一个分支的实例。

简单工厂模式缺点

  • 不符合代码设计六大设计原则中的开放封闭原则, 一旦要添加新的子类,就要在工厂类中去新增分支,只要修改类, 就有潜在的风险, 万一改错了或者手抖了, 把以前的分支删除了可咋整。
  • 封装的还不够好, 如果要修改使用的计算方式,就要逐个的去更改传入的参数,才能创建对应的实例, 如果使用的地方很多, 岂不是要改的也很多?

适用场景

  • 1、工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

  • 2、短期内不会频繁变动,而代码结构也不太复杂时,使用地方也不是很多时, 用此设计模式就足够了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值