现在的很多平台在登陆的时候,下面都会有一排选项,可以选择微信、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);
,获取到GitHub
的IdentityProvider
,获取到对象之后,可以进行GitHub
账号登陆的具体操作。提交、部署、测试、上线,完美完成任务。
在第三方账号平台登陆功能的实现中,你使用到了一种设计模式,叫作简单工厂模式,此时你心里肯定大喊一声,卧槽,这就用上了设计模式?是的,没错,这就是设计模式。既然你好奇,那我们就一起来看看简单工厂模式。
简单工厂模式的定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,是创建型模式的一种。在简单工厂模式中,有一个工厂类来负责其他类的实例创建,这些被创建的实例类都有一个共同的父类,在我们的第三方账号登陆中AliPayIdentityProvider
、WeChatIdentityProvider
都是被实例化的类,它们都有一个共同的父类IdentityProvider
,在简单工厂模式中,工厂类中可以根据传入的参数返回不同的实例,在我们的IdentityFactory
类中,我们提供了一个静态的create(int type)
,可以根据传入的类型返回不同的实例。所以我们这个是标准的简单工厂模式的实例。
上面这一大段不好理解?没关系,那我们在抽象一下,简单工厂模式主要有以下三个成员:
- 抽象产品:抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口,例如
IdentityProvider
- 具体产品:具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例,例如
AliPayIdentityProvider
- 工厂类:负责实现创建所有实例的内部逻辑,例如
IdentityFactory
我们再来看一下简单工厂模式的UML图:
这些该明白简单工厂模式了吧,虽然名字中带有简单两个字,但是按照常理来说,就算再简单,也该会有一些优点吧。既然你还好奇,那就继续来简单工厂模式有哪些优点吧。
简单工厂模式的优点
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
第三方账号登陆功能上线后,你们公司平台