前提
(简单工厂不属于设计模式,而是一种编程思想【抽象一层出来】)工厂方法模式、抽象工厂模式
以上都是为了解耦,如果考虑多个纬度(如需要同时考虑多种电器,多种品牌)则优先考虑抽象工厂。
工厂方法模式是给每一个产品增加一个对应的工厂,然后该工厂依赖于抽象工厂,相当于每加一个产品,就多了两个依赖关系。
策略模式与工厂方法的区别:工厂方法是基于多态,通过不同的对象参数,去找对应的工厂,进而拿到不同的对象;策略方法也是基于多态,但是是通对行为(方法)的拓展。
策略模式的优点:易于拓展、避免重复的ifelse嵌套,充分发挥了面向对象的优点、易于拓展
缺点:会生成很多的策略类、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
思路
提供了多种(登录)策略【配置在yaml文件中】,并且交给Spring容器去管理【这里通过aware接口去拿到applicationContext容器,在bean容器初始化的时候读取并加入到map中】
提供了一个工厂(UserLoginFactory),同时提供一个方法,根据参数提供策略对象(多态,这里返回值是接口,然后多种策略模式去实现该接口)。
步骤
我们将多种不同的策略对象以及工厂都放在一个包下,AccountGranter、SmsGranter分别代表账号登录方式以及短信登录方式。
将多种登录方式抽象出来(工厂模式,解耦)
工厂代码实现:
我们在bean完成自动注入后,通过applicationContext容器将对象全部放到map中
application.yaml中自定义配置:配置多种登录方式,我们可以创建一个配置类,去读取【ConfigurationProperties注解】
这里types名称需要一一对应
本人比较懒,所有的实体类都用的@Data注解,这一行是精髓,通过前端发出的参数得到策略对象,进而调用登录的逻辑。
最后测试: