什么是设计模式
- 一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。简单理解:特定问题的固定解决方法。
- 好处:使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、重用性。
单例模式
- 单例(Singleton):只允许创建一个该类的对象。
饿汉式
- 类加载的时候创建,天生线程安全。
优点
:线程安全
缺点
:生命周期太长,浪费空间
package com.kingtl.SingleDemo;
/**
* 饿汉式单例
* 1、创建一个常量
* 2、构造方法私有化,类外部不能创建对象
* 3、通过一个公开方法,来返回这个对象
*/
public class SingleTon {
private static final SingleTon instance = new SingleTon();
private SingleTon() {}
public static SingleTon getInstance() {
return instance;
}
}
测试:
package com.kingtl.SingleDemo;
public class TestSingleTon {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(SingleTon.getInstance().hashCode());
}
}).start();
}
}
}
懒汉式
- 使用时创建,线程不安全,加同步(可加1、同步方法(在方法上加上synchronized),或者2、同步代码块 ,为了执行效率,如果有一个线程执行过,就无需其他线程进入同步代码块)
优点
:生命周期短,节省空间
缺点
:有线程安全问题
package com.kingtl.SingleDemo;
/**
* 懒汉式单例
* 1、创建一个对象,赋值为 null
* 2、构造方法私有化,类外部不能创建对象
* 3、通过一个公开方法,来返回这个对象
*/
public class SingleTon2 {
// 创建对象
private static SingleTon2 instance = null;
// 私有化构造方法
private SingleTon2() {}
// 创建一个静态方法
public static SingleTon2 getInstance() {
if (instance == null) { // 提高执行效率
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
}
}
}
return instance;
}
}
懒汉式-静态内部类写法
package com.kingtl.SingleDemo;
/**
* 静态内部类写法
*/
public class SingleTon3 {
private SingleTon3() {}
private static class Holder {
static SingleTon3 instance = new SingleTon3();
}
public static SingleTon3 getInstance(){
return Holder.instance;
}
}