单例设计模式:主要用来保证一个类的对象从程序的开始到结束只有一个,单例也就是只有一个类的对象,即类的对象的唯一性。
怎样才能保证类的对象的唯一性呢?
1.将类中的构造参数进行封装,无法使用new 创建类的对象
2.别的类无法创建本类的对象,因此只能在本类中创建本类的对象
3.本类中的唯一对象要想让其他类使用,只能通过类名调用,因此需要在本类中创建一个static修饰的方法,其他类在调用本类方法的时候获取本类中唯一的对象。
4.其实单例设计模式中最重要的还是static关键字的理解,为什么new出来的对象要用static修饰呢,而且要私有化new的对象,用public修饰有什么弊端,这才是单例设计模式一个小亮点,真正理解了 才能真正理解单例模式哦,加油小伙伴们!
而单例设计又分为“饿汉式”和“懒汉式”两种模式。
饿汉式即在类加载时就在堆中开辟空间创建对象:
class Single {
// 1、私有化构造函授
private Single() {
}
// 2、创建本类对象
private static Single s = new Single();
// 3、定义一个方法返回本类的对象
public static Single getInstance() {
return s;
}
// 测试方法
public void test() {
System.out.println("测试方法");
}
}
懒汉式即在类加载时没有在堆中开辟空间,只有在使用对象时才在堆中开辟空间创建对象:
class Single {
// 1、私有化构造函授
private Single() {
}
// 2、创建本类对象
private static Single s = null;
// 3、定义一个方法返回本类的对象
public static Single getInstance() {
if (s==null) {
s = new Single();
}
return s;
}
// 测试方法
public void test() {
System.out.println("测试方法");
}
}
以上两种是只是便于对单例设计模式的理解,实际开发中很少这么使用,现继续补充一些实际用的单例模式
3.内部类模式的单例:
/**
* 内部类模式的单例
*/
public class SingleTon {
private SingleTon() {
}
private static class SingleTonHolder {
private static SingleTon singleTon = new SingleTon();
}
public static SingleTon getSingleTon() {
return SingleTonHolder.singleTon;
}
}
class SingleTonTest {
static class MyThread extends Thread {
@Override
public void run() {
super.run();
System.out.println(Thread.currentThread() + ":线程拥有的单例对象:" + SingleTon.getSingleTon());
}
}
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
Thread thread1 = new Thread(myThread1,"线程1");
Thread thread2 = new Thread(myThread2,"线程2");
thread1.start();
thread2.start();
}
执行结果:
Thread[线程2,5,main]:线程拥有的单例对象:com.yrxy.thread.demo.SingleTon@4449983f
Thread[线程1,5,main]:线程拥有的单例对象:com.yrxy.thread.demo.SingleTon@4449983f
Process finished with exit code 0
4.双重检索模式单例
/**
* 双重检索模式单例
*/
public class SingleTon {
// 定义单例对象
private volatile static SingleTon singleTon;
// 私有化无参构造器
private SingleTon() {
}
// 对外提供生成单例方法
public static SingleTon getInstance() {
// 双重if判断 确保线程安全
if (null == singleTon) {
synchronized (SingleTon.class) {
if (null == singleTon) {
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
class Test {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(SingleTon.getInstance());
}
}
}
执行结果:
"C:\Program Files\Java\jdk1.8.0_251\bin\java.exe"
com.javayh.singleton.entity.SingleTon@3af49f1c
com.javayh.singleton.entity.SingleTon@3af49f1c
com.javayh.singleton.entity.SingleTon@3af49f1c
com.javayh.singleton.entity.SingleTon@3af49f1c
com.javayh.singleton.entity.SingleTon@3af49f1c
5.待补充枚举单例模式