Java单例模式

概要:

单例模式有两种实现方式:一种是将类的构造方法私有化,用一个私有的类变量instance保存类的实例,在加载类时,创建类的实例,并将实例赋给instance;再提供一个公有的静态方法getInstance,用于获取类的惟一实例,该方法直接返回instance。另一种是将类的构造方法私有化,用一个私有的类变量instance保存类的实例,在加载类时,将null赋给instance;再提供一个公有的静态方法getInstance,用于获取类的惟一实例,该方法首先判断instance是否为null,如果为null,则创建实例对象,否则,直接返回instance。

    两种方式的区别在于:前者被加载时,类的惟一实例被创建;后者在第一个调用getInstance()方法时,类的惟一实例被创建,但需要在getInstance()方法的声明中使用synchronized关键字,保证某一时刻只有一个线程调用此方法。

| |目录

package net.xsoftlab.baike;
// 第一种方式实现单例模式
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; // SingletonB的唯一实例
	private TwoSingleton() {// 构造函数私有,防止外界构造OneSingleton实例
	}
	public static synchronized TwoSingleton getInstance() {// synchronized关键字表示方法是线程同步
															// 任一时刻最多只能有一个线程进入该方法
		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());
	}
}


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消