JAVA单例模式Singleton

单例模式能够确保一个类只有一个实例。自行提供这个实例并向整个系统提供这个实例。

 package JAVA_Project_01_05;

//单例模式能够确保一个类只有一个实例。自行提供这个实例并向整个系统提供这个实例。

//实现单例模式的技术要点如下:
//
//· 单例模式有两种实现方式:一种是将类的构造方法私有化,用一个私有的类变量instance保存类的实例,在加载类时,创建类的实例,并将实例赋给instance;再提供一个公有的静态方法getInstance,用于获取类的惟一实例,该方法直接返回instance。另一种是将类的构造方法私有化,用一个私有的类变量instance保存类的实例,在加载类时,将null赋给instance;再提供一个公有的静态方法getInstance,用于获取类的惟一实例,该方法首先判断instance是否为null,如果为null,则创建实例对象,否则,直接返回instance。
//
//· 两种方式的区别在于:前者被加载时,类的惟一实例被创建;后者在第一个调用getInstance()方法时,类的惟一实例被创建,但需要在getInstance()方法的声明中使用synchronized关键字,保证某一时刻只有一个线程调用此方法。


class OneSingleton {//第一种方式实现单例模式

    private static int number = 0;//私有属性

    private static OneSingleton instance = new OneSingleton();//OneSingleton的惟一实例

    private OneSingleton() {//构造函数私有防外界构造OneSingleton实例

    }

    public static OneSingleton getInstance() {//获取OneSingleton的实例

        return instance;

    }

    public synchronized int getNumber() {//synchronized关键字表示方法是线程同步

        return number;//任一时刻最多只能有一个线程进入该方法

    }

    public synchronized void nextNumber() {//将number加1

        number++;

    }

}

class TwoSingleton {

    private static int number = 0;//私有属性

    private static TwoSingleton instance = null;//TwoSingleton的惟一实例

    private TwoSingleton() {//构造函数私有防外界构造TwoSingleton实例

    }

//synchronized关键字表示方法是线程同步

    public static synchronized TwoSingleton getInstance() {

//任一时刻最多只能有一个线程进入该方法

        if (instance == null) {//判断是否instance为空,为空则创建

            instance = new TwoSingleton();

        }

        return instance;

    }

    public synchronized int getNumber() {

        return number;

    }

    public synchronized void nextNumber() {

        number++;

    }

}

public class TextSingleton {//操作单例模式的类

    public static void main(String[] args) {//Java程序主入口处

        OneSingleton one1 = OneSingleton.getInstance();//调用方法获得实例

        OneSingleton one2 = OneSingleton.getInstance();//调用方法获得实例

        System.out.println("用OneSingleton实现单例模式");

        System.out.println("调用nextNumber方法前:");

        System.out.println("one1.number=" + one1.getNumber());

        System.out.println("one2.number=" + one2.getNumber());

        one1.nextNumber();//调用方法

        System.out.println("调用nextNumber方法后:");

        System.out.println("one1.number=" + one1.getNumber());

        System.out.println("one2.number=" + one2.getNumber());

        TwoSingleton two1 = TwoSingleton.getInstance();//调用方法获得实例

        TwoSingleton two2 = TwoSingleton.getInstance();//调用方法获得实例

        System.out.println("用TwoSingleton实现单例模式");

        System.out.println("调用nextNumber方法前:");

        System.out.println("two1.number=" + two1.getNumber());

        System.out.println("two2.number=" + two2.getNumber());

        two1.nextNumber();//调用方法

        System.out.println("调用nextNumber方法后:");

        System.out.println("two1.number=" + two1.getNumber());

        System.out.println("two2.number=" + two2.getNumber());

    }

}

/*
(1)OneSingleton和TwoSingleton类都实现了单例模式,区别是前者在类被加载的时候就创建类的惟一对象,而后者是在第一次调用getInstance()方法时才创建类的惟一实例,因此也被称为lazyinitialization。

(2)在TwoSingleton类中,getInstance()方法声明中使用了synchronized(同步)关键字,以保证同一时刻只有一个线程进入该方法,这样,就保证了只会新建一个对象。

(3)单例模式的实现方法是将构造函数私有,以防止外界通过调用构造函数创建类的对象。将类的惟一对象保存为静态私有属性,然后提供一个静态公有方法获取该惟一对象,可以保证每次返回的都是同一个对象。
 */
发布了70 篇原创文章 · 获赞 10 · 访问量 3174

猜你喜欢

转载自blog.csdn.net/JN_Cat/article/details/103995291
今日推荐