设计模式-创建型-工厂方法模式(FactoryMethod)
参考文献
Java设计模式精讲 Debug方式+内存分析
<<深入设计模式>>
https://refactoringguru.cn/design-patterns/factory-method
https://www.oodesign.com/factory-method-pattern
工厂方法模式
定义一个用于创建对象的接口,但让子类决定实例化哪个类
通过通用接口引用新创建的对象
工厂方法模式通过定义一个工厂接口及其下属的多个具体工厂类,每个具体工厂类负责创建一种特定类型的对象.客户端通过调用工厂接口来创建对象,具体使用哪个具体工厂类由客户端决定.工厂方法模式将对象的创建延迟到具体工厂类中,使得工厂类成为了对象的抽象创建者.
组件
**产品(Product Interface)**定义工厂方法创建的对象的接口
**具体产品(Concrete Products Class)**是产品接口的不同实现.
创建者Creator(也称为Factory,因为它创建Product对象)声明方法FactoryMethod,该方法返回Product 对象 ...
设计模式-创建型-建造者模式(Builder)
参考文献
https://www.oodesign.com/builder-pattern
https://refactoringguru.cn/design-patterns/builder
建造者模式
定义一个实例来创建对象,但让子类决定实例化哪个类
通过通用接口引用新创建的对象
组装复杂的实例
组件
Product: 正在构建的复杂对象
Builder(建造者) : 指定用于创建 Product 对象的各个部分的抽象接口
ConcreteBuilder(具体建造者) : 通过实现 Builder 接口来构建和组合产品的各个部分.它定义并跟踪它创建的表示,并提供用于保存产品的界面
Director(监工) : 类使用 Builder 接口构造复杂对象
Client(使用者)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798 ...
设计模式-创建型-抽象工厂模式(AbstractFactory)
参考文献
抽象工厂模式
抽象工厂提供了用于创建一系列相关对象的接口,而无需显式指定它们的类.
抽象工厂模式通过定义抽象工厂接口及其下属的多个产品接口和多个产品族实现类,每个产品族实现类负责创建一组相关的产品.客户端通过调用抽象工厂接口来创建产品,具体使用哪个产品族实现类由客户端决定.抽象工厂模式将产品的创建延迟到具体产品族实现类中,使得产品的创建与使用相互独立.
上图(图片来自于refactoringguru.cn)的"装饰风艺术"的椅子,沙发,咖啡桌为一个产品族
抽象工厂的工作是将"抽象零件"组装为"抽象产品"
组件
AbstractProduct(抽象产品) : 声明产品对象类型的接口
AbstractFactory(抽象工厂) : 声明创建抽象产品的操作的接口
ConcreteProduct(具体产品) - 定义由相应的ConcreteFactory创建的产品;它实现了AbstractProduct 接口
ConcreteFactory(具体工厂) : 实现创建具体产品的操作.
C ...
设计模式-创建型-简单工厂模式(SimpleFactory)
参考文献
https://java-design-patterns.com/patterns/factory/
https://www.oodesign.com/factory-pattern
简单工厂模式
也称为简单工厂(Simple Factory)或静态工厂方法(Static Factory Method)
创建对象而不向客户端公开实例化逻辑。
通过公共接口引用新创建的对象
简单工厂模式通过一个工厂类来创建不同类型的对象,客户端只需要给工厂传入相应的参数,由工厂来根据参数判断要创建哪一种对象,并返回该对象给客户端使用。简单工厂模式的核心是工厂类,它负责创建对象。
组件
产品接口(Product Interface)
工厂类(Factory Class)
具体产品(Concrete Product Class)
具体实现
12345678910111213141516171819202122public class VideoFactory { public Video getVideo(String type) { switch (type) & ...
解决方案-限流器
参考文献
我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了!
限流的原理以及常用算法
关于两种限流模式
限流的目的
高并发系统中有三把利器用来保护系统:缓存,降级和限流.限流的目的是为了保护系统不被大量请求冲垮,限制系统的输入和输出流量已达到保护系统的目的.在电商的秒杀活动中,限流是必不可少的一个环节.
常见的限流算法有:令牌桶、漏桶.计数器也可以进行限流实现.
令牌桶
令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.可以控制流量也可以控制并发量,假如我们想要控制 API 网关的并发量最高为 1000,可以创建一个令牌桶,以固定的速度往桶里添加令牌,超出了 1000 则不添加.
当一个请求到达之后就从桶中获取一个令牌,如果能获取到令牌就可以继续往下请求,获取不到就说明令牌不够,并发量达到了最高,请求就被拦截.
漏桶
漏桶是一个固定容量的桶,按照固定的速率流出,可以以任意的速率流入到漏桶中,超出了漏桶的容量就被丢弃,总容量是不变的.但是输出的速率是固定的,无论你上面的水流入的多快,下面的出口只有这么大,就像水坝开闸放水一样
常见的 ...
解决方案-延时队列
参考文献
一口气说出 6种 延时队列的实现方法,面试官也得服
延时队列常用实现详解
你真的知道怎么实现一个延迟队列吗 ?
Redisson源码(二)延迟队列RDelayedQueue的使用及原理分析
延时队列的定义
首先队列是一种先进先出(FIFO)的数据结构.普通队列中的元素是有序的,先进入队列的元素会被优先取出进行消费.延时队列相对普通队列最大的区别是在于其"延时"的特性上.
普通队列的元素是先进先出,是按照队列入队的顺序进行处理;延时队列中的元素会指定一个延时时间,表示其希望在经过指定时间后再进行处理.
延时队列的使用场景
新建的订单,如果用户在 15 分钟内未支付,则自动取消.
公司的会议预定系统,在会议预定成功后,会在会议开始前半小时通知所有预定该会议的用户.
安全工单超过 24 小时未处理,则自动拉企业微信群提醒相关责任人.
用户下单外卖以后,距离超时时间还有 10 分钟时提醒外卖小哥即将超时.
延时队列的具体实现方案
Java DelayQueue
DelayQueue是无界的延时阻塞队列,内部是使用优先级队列PriorityQueue ...
SpringMVC-过滤器,拦截器,监听器
参考文献
一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了
实习生:拦截器和过滤器有啥区别?
过滤器(Filter)
作用:过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作Session校验,判断用户权限,如果不符合设定条件,则会被拦截到特殊的地址或者基于特殊的响应。
过滤器的使用
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869package com.holelin.sundry.filter;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet ...
SpringBoot-日志切面
参考文献
又被逼着优化代码,这次我干掉了出入参 Log日志
注解
123456789101112131415161718192021222324252627282930package com.holelin.sundry.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @Description: * @Author: HoleLin * @CreateDate: 2022/1/12 2:37 PM * @UpdateUser: HoleLin * @UpdateDate: 2022/1/12 2:37 PM * @UpdateRemark: 修改内容 * @Version: 1.0 */@Target( ...
Java并发源码分析-AbstractQueuedSynchronizer源码分析
参考文献
万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)
<<Java并发编程艺术>>
AbstractQueuedSynchronizer
队列同步器,简称同步器或AQS
AQS可重写的方法
方法名称
方法描述
protected boolean tryAcquire(int arg)
独占式获取同步状态
protected boolean tryRelease(int arg)
独占式释放同步状态
protected int tryAcquireShared(int arg)
共享式获取同步状态返回值>=0表示获取成功,反之获取失败
protected boolean tryReleaseShared(int arg)
共享式释放同步状态
protected boolean isHeldExclusively()
当前同步器是否在独占模式下被线程使用,一般该方法表示是否被当前线程独占.
同步状态指的是有volatile修饰的state变量,涉及的相关方法
方法名称
方法描述 ...
Java并发编程(七)-Java内存模型(JMM)
参考文献
<<Java并发编程艺术>>
<<深入理解Java虚拟机-JVM高级特性与最佳实践>>
JSR 133 (Java Memory Model) FAQ
The Java Memory Model
【死磕Java并发】-----Java内存模型之happens-before
The JSR-133 Cookbook for Compiler Writers
Java内存模型(JMM)
The Java memory model describes how threads in the Java programming language interact through memory. Together with the description of single-threaded execution of code, the memory model provides the semantics of the Java programming language. --Wikipedia
Java内存模型描述了Java编程 ...