设为首页 加入收藏

TOP

工厂模式,从第三方登录说起(一)
2019-09-18 11:11:17 】 浏览:100
Tags:工厂 模式 第三方 登录 说起

现在的很多平台在登陆的时候,下面都会有一排选项,可以选择微信、QQ、微博账号等登陆,这些账号对平台来说都是第三方账号。第三方账号登陆是最近几年流行起来的,第三方账号登录一般都是基于OAuth2.0协议开发的。如果你不了解OAuth2.0协议,可以自行百度,也许会对你看这篇文章有所帮助。

现在由于公司要给平台引入流量,为了降低注册门槛,让更多的人来使用你们的平台,领导决定在你们的平台上接入第三方账号登陆功能。现阶段先接入微信、支付宝、QQ、GitHub 这四个第三方账号登陆。这个任务也顺利的落到你的头上,由于你了解OAuth2.0协议,你知道这个是一个固定的三段式操作,第一步获取Authorization Code,第二步获取Access Token,第三步调用信息接口,但是每个平台返回来的数据字段或者格式可能会不一样,所以你根据你的开发经验,为第三方账号登录模块抽取出来了一个IdentityProvider抽象类,该类主要有上面提到的三步需要的接口,IdentityProvider类的代码如下:

public abstract class IdentityProvider {

    // 获取Authorization Code
    abstract void authorizationCode();

    // 获取 Access Token
    abstract void accessToken();

    // 获取用户信息
    abstract void getUserInfo();
}

每一个第三方账号平台都继承IdentityProvider,根据每个第三方账号平台的规则去实现这三个接口,我们已支付宝为例,我们定义一个AliPayIdentityProvider类,该类继承了IdentityProvider类,AliPayIdentityProvider类代码如下:


/**
 * 支付宝 第三方登陆具体实现
 */
public class AliPayIdentityProvider extends IdentityProvider{

    private static final String APPID = "你申请的运用id";
    private static final String APPKEY = "你的私钥";

    public AliPayIdentityProvider() {
        System.out.println("我是支付宝第三方登陆具体实现");
    }

    @Override
    abstract void getUserInfo(){
        // 获取用户信息
    }

    @Override
    public void authorizationCode() {
        //获取authorization Code
    }

    @Override
    public void accessToken() {
        //获取access Token
    }
}

四个第三方账号登录平台都按照上面的方式做了具体的实现,除此之外,你还创建了一个IdentityFactory类,该类是创建实例的唯一入口,里面提供了一个静态create方法,create方法的作用是根据传入的参数返回对应的第三方账号平台实例。IdentityFactory类代码如下:

public class IdentityFactory {
    /**
     * 第三方登陆实例获取
     * @param type 标识符,1:支付宝登陆 2:微信登陆 3:QQ登录 4:github登陆 
     */
    public static IdentityProvider create(int type){
        IdentityProvider identityProvider = null;
        switch (type){
            case 1:
                identityProvider = new AliPayIdentityProvider();
                break;
            case 2:
                identityProvider = new WeChatIdentityProvider();
                break;
            case 3:
                identityProvider = new QQIdentityProvider();
                break;
            case 4:
                identityProvider = new GitHubIdentityProvider();
                break;
        }
        return identityProvider;
    }
}

客户端调用时只需要调用create()方法即可以获取对应的实例,比如要使用GitHub账号登陆,我们只要调用IdentityProvider identityProvider = IdentityFactory.create(4);,获取到GitHubIdentityProvider,获取到对象之后,可以进行GitHub账号登陆的具体操作。提交、部署、测试、上线,完美完成任务。

在第三方账号平台登陆功能的实现中,你使用到了一种设计模式,叫作简单工厂模式,此时你心里肯定大喊一声,卧槽,这就用上了设计模式?是的,没错,这就是设计模式。既然你好奇,那我们就一起来看看简单工厂模式。

简单工厂模式的定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,是创建型模式的一种。在简单工厂模式中,有一个工厂类来负责其他类的实例创建,这些被创建的实例类都有一个共同的父类,在我们的第三方账号登陆中AliPayIdentityProviderWeChatIdentityProvider都是被实例化的类,它们都有一个共同的父类IdentityProvider,在简单工厂模式中,工厂类中可以根据传入的参数返回不同的实例,在我们的IdentityFactory类中,我们提供了一个静态的create(int type),可以根据传入的类型返回不同的实例。所以我们这个是标准的简单工厂模式的实例。

上面这一大段不好理解?没关系,那我们在抽象一下,简单工厂模式主要有以下三个成员:

  • 抽象产品:抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口,例如IdentityProvider
  • 具体产品:具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例,例如AliPayIdentityProvider
  • 工厂类:负责实现创建所有实例的内部逻辑,例如IdentityFactory

我们再来看一下简单工厂模式的UML图:

这些该明白简单工厂模式了吧,虽然名字中带有简单两个字,但是按照常理来说,就算再简单,也该会有一些优点吧。既然你还好奇,那就继续来简单工厂模式有哪些优点吧。

简单工厂模式的优点

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

第三方账号登陆功能上线后,你们公司平台

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C#中增量类功能的方式之 继承与扩.. 下一篇Docker Compose部署项目到容器-基..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目