饿汉式和懒汉式实现单例模式

单例模式

采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

饿汉式实现单例模式

class SingleTon {

    private String name;

    // get,set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    // step1: 将所有构造器私有化,防止类外创建对象
    private SingleTon() {}
    private SingleTon(String name) {
        this.name = name;
    }

    // step2: 在类的内部创建对象,因为要提供一个公共的方法返回这个对象,那么将这个对象封装成private
    // step3: 在static的方法中只能使用static的属性或方法,所以给这个对象追加static
    private static SingleTon obj = new SingleTon();

    // step3: 提供公共方法返回该对象
    // 如何调用该方法? 通常使用"对象.方法"调用,但是单例模式就创建一个对象,而这个方法是返回这个对象的,
    // 所以用"类名.方法"调用,将该方法声明为static
    public static SingleTon getObj() {
        return obj;
    }


    public static void main(String[] args) {

        SingleTon obj1 = SingleTon.getObj();
        SingleTon obj2 = SingleTon.getObj();

        System.out.println(obj1 == obj2); // true

    }

}

懒汉式实现单例模式

class SingleTon2 {

    private SingleTon2() {}

    private static SingleTon2 obj = null;

    // 线程不安全的写法:
//    public static SingleTon2 getObj() {
//
//        if (obj == null) {
//            obj = new SingleTon2();
//        }
//
//        return obj;
//    }

    // 安全写法一: 同步方法
//    public static synchronized SingleTon2 getObj() {
//
//        if (obj == null) {
//            obj = new SingleTon2();
//        }
//
//        return obj;
//    }

    // 安全写法二: 同步代码快
    public static SingleTon2 getObj() {

        // 用synchronized代码块对所有对象共享数据obj进行包裹
//        synchronized (SingleTon2.class) {
//            if (obj == null) {
//                obj = new SingleTon2();
//            }
//
//            return obj;
//        }
        
        // 但是上面的写法效率稍差,比如,第一个对象创建的时候,还没有obj,它创建了,
        // 那么其他对象再创建的时候,就没有必要每次都要判断赋值了,所以在此基础上,加一个判断
        // 有了obj对象以后,其他新创建的对象就直接获取就行了
        if (obj == null) {
            synchronized (SingleTon2.class) {
                if (obj == null) {
                    obj = new SingleTon2();
                }

            }
        }
        return obj;

    }


}

上一篇:headfirsh设计模式——单件模式例子


下一篇:[有限元] Ansys Workbench Mechanical 中的应力应变显示类型的文档翻译