设计模式分类
设计模式分为三种类型,共23种 1)
创建型模式
:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式
:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享 元模式、代理模式。行为型模式
:模版方法模式、命令模式、访问者模式、迭代器模式、观察者 模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模 式、策略模式、职责链模式(责任链模式)。
单例模式
在整个软件系统中某个类只有一个实例化对象 即为单例模式
单例模式有八种
- 饿汉式
这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同 步问题。
在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始 至终从未使用过这个实例,则会造成内存的浪费
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
- 懒汉式
解决了线程不安全问题
效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行 同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例, 直接return就行了。
方法进行同步效率太低
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 双重检查
双重检查概念是多线程开发中常使用到的,如代码中所示,我们进行了两 次if (singleton == null)检查,这样就可以保证线程安全了。
这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null), 直接return实例化对象,也避免的反复进行方法同步.
线程安全;延迟加载;效率较高
class Singleton {
private static volatile Singleton singleton;
private Singleton() {
}
public static synchronized Singleton getSingleton() {
if (Singleton.singleton == null) {
synchronized (Singleton.class) {
if (Singleton.singleton == null) {
Singleton.singleton = new Singleton();
return Singleton.singleton;
}
}
}
return Singleton.singleton;
}
}
- 静态内部类
这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化 时,调用getInstance方法,才会装载SingletonHolder类,从而完成Singleton的 实例化。
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们 保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 枚举
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}