前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之工厂模式

设计模式之工厂模式

原创
作者头像
xgc
发布2022-02-26 17:34:47
3440
发布2022-02-26 17:34:47
举报
文章被收录于专栏:SpringCloud-Alibaba

俗话说好的设计模式让一个产品走向更好,算了,其实就是我说的,在没了解设计模式之前,就是在写 “shi”山,满屏的ifelse,后来发现了设计模式,看到代码是真的优雅。

工厂模式其实是创建的模式,何为创建模式,就是为了方便对象的创建。拿最简单的登录来说,咱们系统需要接入,掘金、微信、QQ等三个接口,我们可以创建不同Service,在里面登录。在controller中判断是哪一个登录类型,然后进行ifelse判断,又是一大堆的ifelse。现在我们写一下相关代码。

代码语言:txt
复制
String reqJson = JSON.toJSONString(req);
LoginRes loginRes = null;
try {
    logger.info("登录开始{}。req:{}", req.getuId(), reqJson);
    // 按照不同类型方法登录[1掘金、2微信、3QQ]
    if (req.getLoginType() == 1) {
        JuejinService juejinService = new JuejinService();
        JuejinResult juejinResult = juejinService.Login(data);
        if ("0000".equals(juejinResult.getCode())) {
            loginRes = new LoginRes("0000", "登录成功");
        } else {
            loginRes = new LoginRes("0001", JuejinResult.getInfo());
        }
    } else if (req.getLoginType() == 2) {
        WeixinService weixinService = new WeixinService();
        Boolean isSuccess = WeixinService.Login(data);
        if (isSuccess) {
            loginRes = new loginRes("0000", "登录成功");
        } else {
            loginRes = new AwardRes("0001", "登录失败");
        }
    } else if (req.getLoginType() == 3) {
        
        QQService qQService = new QQService();.
        Boolean isSuccess = qQService.Login(data);
         if (isSuccess) {
            loginRes = new loginRes("0000", "登录成功");
        } else {
            loginRes = new AwardRes("0001", "登录失败");
        }
    }
    logger.info("登录完成{}。", req.getuId());
} catch (Exception e) {
    logger.error("登录失败{}。req:{}", req.getuId(), reqJson, e);
    loginRes = new LoginRes("0001", e.getMessage());
}

return LoginRes;

这样如果我们继续加登录方法,会不断的写ifelse,同时这样看 你是不是觉得更加像 “shi”山了。

下面我们来用我们的工厂模式写一下。

首先自定义Login接口

代码语言:txt
复制
public interface Login {

    void login(String uId, , Map<String, String> extMap) throws Exception;

}

所有登录方式、虚拟还是第三⽅,都需要通过我们的程序实现此接⼝进⾏处理,以保证最 终⼊参出参的统⼀性。 接⼝的⼊参包括; ⽤户ID、扩展字段等(再次举例子)

我们所有的无论是JuejinService WeixinService QQService 都需要实现这个接口然后再login内部进行自己的逻辑判断等等。

下面就是我们的重磅工厂了LoginFactory

再次我们进行判断。

代码语言:txt
复制
public class LoginFactory {

    public Login getLoginService(Integer LoginType) {
        if (null == LoginType) return null;
        if (1 == LoginType) return new JuejinService();
        if (2 == LoginType) return new WeixinService();
        if (3 == LoginType) return new QQService();
        throw new RuntimeException("不存在的登录类型");
    }

}

这样是不是有条理多了。

代码语言:txt
复制
@Test
public void test_commodity() throws Exception {
    LoginFactory loginFactory = new LoginFactory();

    // 1. Juejin
    Login loginService_1 = loginFactory.getLoginService(1);
    loginService_1.sendCommodity(data);

    // 2. Weixin
    Login loginService_2 = loginFactory.getLoginService(2);
    loginService_2.sendCommodity(data);

    // 3. QQ
    Login loginService_3 = loginFactory.getLoginService(3);
    loginService_3.login(data);

}

从上到下的优化来看,⼯⼚⽅法模式并不复杂,甚⾄这样的开发结构在你有所理解后,会发现更加简单了。 那么这样的开发的好处知道后,也可以总结出来它的优点;避免创建者与具体的产品逻辑耦合、满⾜单⼀职责,每⼀个业务逻辑实现都在所属⾃⼰的类中完成 、满⾜开闭原则,⽆需更改使⽤调⽤⽅就可以在程序中引⼊新的登录类型 。但这样也会带来⼀些问题。每次增加一个登录方式时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。所以还需要与其他设计模式相结合,才能打造出我开文提到的让一个产品走向更好(收尾呼应点题)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档