工厂模式:
- 简单工厂
- 简单工厂也算是一种特殊的工厂方法
- 工厂方法
- 抽象工厂
简单工厂和工厂方法的主要区别就是,简单工厂模式中,所有对象都是通过一个工厂类进行实现。而工厂方法中每一种对象都通过单独具体的工厂类进行创建。解决类型越来越多,一个工厂不好进行维护时。
简单工厂的核心角色:
简单工厂的核心角色主要有三个:
- 工厂类角色
- 根据传入的参数来判断创建对应的产品对象
- 抽象产品角色
- 具体产品所需要实现的接口或者需要集成的父类
- 具体产品角色
- 工厂类创建的具体对象就是该具体角色
策略模式:
策略模式也非常易理解,针对一个功能,有许多不一样的实现方案去实现,比如我要从A点去到B点,可以有很多策略,小红跑着去,小明跳着去,小白走着去。不同的人对应的策略不一样,具体实现也会不一样。
根据以上例子可以对策略模式的核心角色进行概括,主要有三个:
- 抽象策略: a → b
- 具体策略: 小红跑着去,小明跳着去,小白走着去
- 上下文: 这个部分主要是启一个对具体策略进行封装的作用(核心就是提炼公共逻辑部分)
- 用大白话来说就是,如果需要从A → B之前先吃个饭,那么,吃饭这个逻辑可以封装在上下文中。这样封装,每次执行具体的策略,都会先执行吃饭这个逻辑。
总结:
通过对两个设计模式的初步了解,可以知道他们的优缺点,以及怎么进行互补。
对于工厂模式,他的核心作用就是根据不同的参数,给我返回不同的对象。对于策略模式,针对同一个接口,不同的类有不同的实现逻辑。但是如何根据动态参数去找到对应的策略类,是个问题。这时候工厂模式就能巧妙的解决这个问题。
首先就是要实现动态参数与具体的策略实现类进行关系绑定,这个关系由工厂类来进行维护,所有具体产品角色(具体策略)都继承或实现抽象产品角色(抽象策略)在初始化时将自己的绑定关系注册到工厂类中。当需要某一个具体的实现类时,客户端仅需要拿着和实现类对应的参数给工厂类,然后就可以获得具体的实现类,并执行对应的处理逻辑
简单来说,二者结合的过程中,就是把工厂模式中的抽象产品角色和具体产品角色换成策略模式中的抽象策略和具体策略。
具体业务场景实现:
业务需求背景:当直播间配置了累积观看激励任务,直播间结束一小时后,会对满足要求的观众进行奖励的发放。解决方案主要为mq的方式,1:使用rocketmq的延时消息,2:定时任务 + rocketmq。核心就是rocketmq,使用mq,首先就是消息体,为了可扩展性,后面可能会有其他情况。将消息体中进行type类型的标记。在消费者端根据消息体中type,执行对应的业务逻辑。
根据这个需求,非常契合使用策略模式 + 工厂模式。
首先就是绑定type与具体策略进行绑定,维护在工厂类中。这里具体实现有一丝不一样,这里并没有使用工厂类来就行关系的维护,而是直接使用抽象策略进行维护,这样的一个好处就是,当具体策略初始化进行绑定时,都会执行抽象策略中的init,将关系进行初始化。不需要单独为每一个具体策略类写一个初始化绑定方法。
并且提供了根据传入的不同的type获取不同的策略类。
其次就是在抽象策略中也定义了统一的行为。这里主要定义了两个行为,execute是执行具体的业务逻辑,validMessage是校验参数信息。
最后在具体策略类中,对统一的行为,实现自己的具体逻辑就可以了
具体调用逻辑就是首先根据type获取具体的策略类,然后就可以执行对应逻辑。