单例的代码实现

单例模式

1什么是单例

单例就是要求指定的单例在代码的运行过程中有且只能有一个类对象

代码实现

针对单例我们写一个单身狗的例子让其他人都不能随便创建单身狗具体的单码我们一步步分析

1.我们希望当前SingLeDog在整个JAVA程序中有且只有唯一的一个SingLeDog类对象。

问题1:
目前创建SingleDog对象的方式非常方便,直接使用new关键字+构造方法就可以获取到一个SingleDog类对象,没有任何约束力,任何人都可以创建SingleDog类对象。
解决1:
私有化构造方法,让调用构造方法的过程不在这么简单
问题2:
私有化构造方法,可以解决创建对象没有任何约束的问题,但是你也没没对象了啊?
分析:
希望SingleDog类外可以有获取对象的方式
构造方法私有化,类外不能使用,但是类内可以使用。
希望类内创建一个对象,如何通过一个方法返回给类外
方法

public 类外需要使用
    类外没有对象,无法使用普通成员方法,这里需要通过类名来调用方法
        static 修饰方法,使用类名直接调用
        SingleDog 类对象作为返回值类型
        getInstance
        public static SingleDog getInstance()

问题3:
这里创建的对象依然是不同的对象。

分析:
创建对象的过程,过于简单,没有任何的约束和判断。
如果可以保存创建对象的首地址,当前首地址为null,调用创建对象过程,保存地址如果首地址不是null,证明存在当前对象,直接返回对应的地址。

这里需要一个东西来保存SingleDog类对象的空间首地址。
   成员变量
       目前该变量的使用位置是getInstance方法内,但是getInstance方法是一个static
       修饰的静态成员方法。不能直接使用成员变量。pass
   局部变量
       pass
       不具有持久性
 静态成员变量
      好的
       1. 具有持久性,
       2. 可以直接用于static修饰的成员方法
  private static SingleDog sd = null;

问题4:
如果是多线程情况下,一定要考虑加锁,容易出现多线程情况下相互强制资源的过程

解决:
同步代码块
需要选择一个和当前类有关,并且唯一的类对象,作为锁对象。
SingleDog.class 类锁

问题解决完了就该上代码了
class SingleDog {

    private static SingleDog sd = null;

    private SingleDog() {}

    public static SingleDog getInstance() {
        synchronized (SingleDog.class) {
            if (null == sd) {
                sd = new SingleDog();
            }
        }
        return sd;
    }
}

public class Demo1 {
    public static void main(String[] args) {
        SingleDog singleDog1 = SingleDog.getInstance();
        SingleDog singleDog2 = SingleDog.getInstance();
        SingleDog singleDog3 = SingleDog.getInstance()
        // SingleDog对象就一个,你们任何人都不能创建单身狗

        System.out.println(singleDog1);
        System.out.println(singleDog2);
        System.out.println(singleDog3);
    }
}
这样子一个单身狗的单例就实现了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值