饿汉单例模式《1》

A. 简单饿汉单例模式

/**
 * @author xiyou
 * 最简单的饿汉单例
 */
public class SimpleHungrySingleton {

    //类加载的时候,单例已经创建
    private static SimpleHungrySingleton SIMPLE_HUNGRY_INSTANCE = new SimpleHungrySingleton();

    //构造函数私有化
    private SimpleHungrySingleton() {
    }

    //提供全局访问点
    public static SimpleHungrySingleton getEhanMonitor() {
        return SIMPLE_HUNGRY_INSTANCE;
    }
}
  1. A是最简单的恶汉单例模式
  2. 也不会存在线程安全问题
  3. 但是为什么有时候不使用这个呢?
  4. 因为它不像懒汉模式是延迟加载,所谓延迟加载就说需要使用的时候才创建
  5. 其实还有一点为什么大部分不用恶汉,比如传参数的问题。
  6. 加入一个对象的创建需要传一个参数,满足要求的时候再创建,恶汉就做不到了

A1 简单饿汉单例的变种

/**
 * @author xiyou
 * SimpleHungrySingleton的变种,其实它一样,没啥区别,就是在构造函数里面初始化
 */
public class StaticHungrySingleton {

    //类加载的时候,单例已经创建
    private static StaticHungrySingleton STATIC_HUNGRY_INSTANCE;

    //静态代码块,其实没啥用,只是spring先属性后方法,先静态后动态,先上后下
    private StaticHungrySingleton() {
        STATIC_HUNGRY_INSTANCE = new StaticHungrySingleton();
    }
    
    //提供全局访问点
    public static StaticHungrySingleton getEhanMonitor() {
        return STATIC_HUNGRY_INSTANCE;
    }
}

B. 带有全局变量的饿汉模式

 /**
 * xiyou-todo B恶汉模式
 * 1. 如果在恶汉单例模式里面添加一个它的全局属性
 * 2. 如果想获取它的yourClass 可以调用直接调用yourClass
 * 3. 但是这样对象还是会初始化,会进行构造方法初始化
 * 4. 但是也只会初始化一次
 */

public class StaticPropertyHungry {
    /**
     * todo-xiyou 饿汉模式
     * 1. 如果在饿汉单例模式里面添加一个它的全局属性
     * 2. 如果想获取它的yourClass 可以调用直接调用yourClass
     * 3. 但是这样对象会使当前对象初始化(构造方法初始化,虽然指挥初始化一次),但我还是不想让类初始化怎么办
     * 4.
     */
    public static final String YOUR_PROPERTY = "xiyou";


    private static StaticPropertyHungry classMonitor = new StaticPropertyHungry();

    private StaticPropertyHungry() {
        System.out.println("饿汉模式:构造方法初始化,只会初始化一次" + YOUR_PROPERTY);
    }

    public static StaticPropertyHungry getClassMonitor() {
        System.out.println("饿汉模式,获取对象" + classMonitor);
        return classMonitor;
    }

    public static void main(String[] args) {
        System.out.println(StaticPropertyHungry.YOUR_PROPERTY);
        System.out.println(StaticPropertyHungry.YOUR_PROPERTY);
        System.out.println("上面是只调用单例模式的属性,但是也会进行类的初始化");
        System.out.println(StaticPropertyHungry.YOUR_PROPERTY + getClassMonitor());
        System.out.println(StaticPropertyHungry.YOUR_PROPERTY + StaticPropertyHungry.getClassMonitor());
    }
}

结果:发现调用内部属性会进行类的初始化,虽然只会初始化一次

饿汉模式:构造方法初始化,只会初始化一次xiyou
xiyou
xiyou
上面是只调用单例模式的属性,但是也会进行类的初始化
饿汉模式,获取对象cn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
xiyoucn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
饿汉模式,获取对象cn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
xiyoucn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358

C 如何获取类的全局变量但是不进行类初始化?

如果还想获取内部的属性,但是还不想进行初始化,所有B就不适合了,那用什么呢?静态内部类实现的单例模式可以解决,嘿嘿!
参见:静态内部类实现单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值