掌握设计模式的层次
设计模式介绍
设计模式分为三种类型,共23种
创建型模式:单例模式,抽象工厂模式,原型模式,建造者模式,工程模式。
结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
行为型模式:模块方法模式,命令模式,访问者模式,迭代模式,观察者模式,中介者模式,备忘录模式,解释器模式(Interpreter模式),状态模式,策略模式,职责链模式(责任链模式)
注意:不同的书籍上对分类和名称略有差别。
单例模式
单例模式介绍
? 所谓类的单例设计模式,就是采取一定的方法保证再整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供了一个取得对象实例的方法(静态方法)。
? 比如Hibernate的SessionFactory,他充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactoury就够,这是就会用到单例模式。
单例设计模式有八种写法
饿汉式(静态常量)
构造器私有化(防止 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() {}
单例模式注意事项和细节说明
原文:https://blog.51cto.com/14954398/2577049