mini设计模式
创建型
单例模式
-
饿汉式
public class Singleton () { private static Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance() { return instance; } }
-
懒汉式
public class Singleton { private static Singleton instance = null; private Singleton() { } public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
-
双重校验锁
public class Singleton { private static volatile Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance == null) { synchronized(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }
工厂模式
图例
简单工厂模式
工厂模式
简单工厂VS工厂
相同:
工厂负责产品类的创建,使用者需要使用产品类的时候直接请求工厂就与产品类复杂的创建和实现分离了,只关注它的接口,只要它的接口满足使用者要求就不会影响上层模块,后期当产品类变化时,维护起来也比较方便
不同:
简单工厂:一个工厂类负责所有产品的生产,当有新的子类产品时,需要修改工厂类,这违背了开闭原则
工厂:抽象出了一个抽象工厂类,每个实际工厂类对应一个实际产品的生产,当有新的子类产品时,只需增加工厂子类即可,增加了灵活性
抽象工厂模式
结构型
适配器模式
装饰者模式
外观模式
代理模式
行为型
策略模式
模版模式
Spring中的设计模式
模板方法模式以及hook方法的应用:
BeanFactory提供了getBean接口,在子类AbstractBeanFactory中重写了getBean,具体内容是bean没有实例化对象的话,就先实例化再依赖注入,依赖注入需要调用applyProperty函数,在AbstractBeanFactory中该函数为空,留给子类来实现。比如对于构造注入,setter注入,Field注入写不同的实现类工厂方法模式的应用:
Spring的主要思想ioc就是指将对象的创建权利移交给工厂,主要实现是: BeanFactory是个抽象工厂,其子类实现getBean方法决定如何对类进行实例化并返回对象,使用者需要某个对象的时候直接请求BeanFactory让它去加载,就与该类复杂的创建和实现分离了,使用者只关注它的接口,只要它的接口满足使用者要求就不会影响上层模块,后期当产品类变化时,维护起来也比较方便外观(门面)模式的运用:
Spring有几个重要的模块:比如Resouce,BeanDefinitionReader,BeanFactory,ApplicationContext集成了这几个模块的功能,直接通过ApplicationContext就可以对资源进行定位,加载,管理代理模式的运用:
通过jdk的动态代理:jdk的动态代理是基于接口的,被代理类必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。
通过cglib动态代理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。单例模式的运用:
Spring中如果指定bean的类型为singleton,那么每次getBean会从hashmap中取,如果取不到先就实例化后放入hashmap中去策略模式:
Spring对资源访问的封装是策略模式的经典实现,spirng使用Resource接口来抽象资源,代表资源访问策略,其子类分别实现了不同的策略,例如:UrlResource:访问网络资源的实现类。ClassPathResource:访问类路径资源。FileSystemResource:访问文件系统资源。客户端程序只和 Resource 接口耦合,而与具体的访问策略解耦,可以在策略之中*切换。