设计模式
2022-02-21 本文已影响0人
林几许
常见的设计模式有哪些?
常见的工厂模式,代理模式,模板方法模式,责任链模式,单例模式,包装设计模式,策略模式等。
手写代码用的多的一般是模板方法模式,责任链模式,策略模式,单例模式。
Spring中有工厂模式,代理模式。
单例模式
- 饿汉式,简单懒汉式(在方法声明时加锁),DCL双重检验加锁(进阶懒汉式),静态内部类(优雅懒汉式),枚举。
所谓懒汉式,是指还没被用到,就直接初始化了对象,所谓懒汉式指的是等用到的时候,才进行初始化。
//饿汉式
class Singleton{
private static Singleton singleton = new Singleton();
provate Signleton(){}
provate static Singleton getInstance(){
return singleton;
}
}
//简单懒汉式(方法加锁)
class Singleton{
private static Singleton singleton = null;
provate Signleton(){}
provate static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
//DCL懒汉式
class Singleton{
//这里要加volatile修饰,防止指令重排导致线程不安全的问题
private static volatile Singleton singleton = null;
provate Signleton(){}
provate static synchronized Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
//静态内部类 懒汉式
class Singleton{
provate Signleton(){}
//使用静态内部类的方式来实现懒加载(一定线程安全)
provate static class lazyHolder{
private static final Singleton singleton = new Singleton();
}
provate static final Singleton getInstance(){
return lazyHolder.singleton;
}
}
//枚举
enum Singleton{
SINGLETON,
}
模板方法模式
//模板方法模式
public boolean handle(Task task){
//messyCodeCheck是统一逻辑处理方法
if(messyCodeCheck(task)){
return doHandle(task)
}else {
return false
}
}
//doHandle由子类实现
public abstract boolean doHandle(Task task);
代理模式
Spring的Aop就是代理
Spring使用的常见设计模式
- Spring IOC容器可以理解为应用了工厂模式,通过ApplicationContext或beanFactory去获取对象
- Spring的对象默认都是单例的
- Spring AOP用了代理模式
- Spring的事务处理器应用了模板方法模式
- Spring的事件驱动模型用了观察者模式