个人对单例设计模式的理解(7中单例写法)

 

单例设计模式:主要用来保证一个类的对象从程序的开始到结束只有一个,单例也就是只有一个类的对象,即类的对象的唯一性。

怎样才能保证类的对象的唯一性呢?

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.待补充枚举单例模式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值