前言
掌握设计模式的层次java
设计模式介绍程序员
设计模式分为三种类型,共23种数据库
建立型模式:单例模式,抽象工厂模式,原型模式,建造者模式,工程模式。编程
结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式设计模式
行为型模式:模块方法模式,命令模式,访问者模式,迭代模式,观察者模式,中介者模式,备忘录模式,解释器模式(Interpreter模式),状态模式,策略模式,职责链模式(责任链模式)安全
注意:不一样的书籍上对分类和名称略有差异。session
单例模式
单例模式介绍多线程
所谓类的单例设计模式,就是采起必定的方法保证再整个的软件系统中,对某个类只能存在一个对象实例,而且该类只提供了一个取得对象实例的方法(静态方法)。框架
好比Hibernate的SessionFactory,他充当数据存储源的代理,并负责建立Session对象。SessionFactory并非轻量级的,通常状况下,一个项目一般只须要一个SessionFactoury就够,这是就会用到单例模式。jvm
单例设计模式有八种写法
饿汉式(静态常量)
构造器私有化(防止 new)
类的内部建立对象
向外暴露一个静态的公共方法。gentInstance
代码实现
public class SingletonTest1 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() {} //2. 在本类内部建立对象实例 private final static Singleton instance = new Singleton(); //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } }
优缺点说明
饿汉式(静态代码块)
代码
public class SingletonTest2 { public static void main(String[] args) { //测试 Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } //饿汉式(静态变量) class Singleton { //1. 私有化构造器,外部不能能new private Singleton() { } //2. 在本类内部建立对象实例 private static Singleton instance; //在静态代码块中,建立对象 static { instance = new Singleton(); } //3. 提供一个共有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } }
优缺点说明
懒汉式(线程不安全)
代码
public class SingletonTest03 { public static void main(String[] args) { //测试 System.out.println("懒汉式1,线程不安全"); Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//1163157884 } } class Singleton { private static Singleton instance; public Singleton() { } //提供一个静态的共有方法,当使用该方法时,才去建立instance //即懒汉式 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
懒汉式(线程安全,同步方法)
代码
class Singleton{ private static Singleton singlenton; private Singleton(){} //加入了同步代码,解决线程不安全问题 public static synchronized Singlenton getInstance(){ if(singleton==null){ singleton=new Singleton(); } return singleton; } }
优缺点说明
懒汉式(线程安全,同步代码块)
代码
class Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //同代码块 synchronized (Singleton.class){ singleton=new Singleton(); } return singleton; } } }
优缺点说明
双重检查
代码演示
class Singleton{ //volatile把它认为是一个轻量级的synchronized private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ //保证只有一个线程在这里执行,当下一个线程进来的时候, //上一个线程已经建立完了singleton已经不等于null了,就不会建立了 //提供一个静态的共有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题 //同时保证了效率,推荐使用 synchronized(Singleton.class){ if(singleton==null){ singleton=new Singleton(); } } } return singleton; } }
优缺点说明
静态内部类
代码演示
//当外部类装载的时候静态内部类不会被装载的 //当咱们调用静态方法时静态内部类的时候只会装载一次,并且装载的时候线程是安全的。 public class SingletonTest07 { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance1 = Singleton.getInstance(); System.out.println(instance == instance1);//true System.out.println("instance.hashCode=" + instance.hashCode());//instance1.hashCode=1163157884 System.out.println("instance1.hashCode=" + instance1.hashCode());//instance1.hashCode=1163157884 } } //静态内部类完成,推荐使用 class Singleton { //构造器私有化 private Singleton() { } //写静态内部类,该类有一个静态属性 private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } //提供一个静态的共有方法,直接返回SingletonInstance.INSTANCE public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }
优缺点说明
枚举
代码实例
public class SingletonTest8 { public static void main(String[] args) { Singleton instance = Singleton.INSTANCE; Singleton instance2 = Singleton.INSTANCE; System.out.println(instance == instance2);//true System.out.println(instance.hashCode());//1163157884 System.out.println(instance2.hashCode());//1163157884 instance.sayOK(); } } //使用枚举能够实现单例,推荐使用 enum Singleton { INSTANCE; public void sayOK() { System.out.println("ok~");} }
单例模式在jdk应用的源码分析
单例模式在jdk应用的源码分析
//单例设计模式的懒汉式 public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } private Runtime() {}
单例模式注意事项和细节说明