Java学习-排序

目标

  • 设计一个类,只能生成该类的一个实例
  • 单例模式

关键点

  • 一个类只有一个实例,这是最基本的
  • 它必须自行创建这个实例
  • 它必须自行向整个系统提供这个实例

实现方式

  • 懒汉模式(类加载时不初始化)
  • 饿汉模式(在类加载时就完成了初始化)

###懒汉式单例模式
懒汉模式代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package singleton;
public class LazySingleton {
//懒汉单例模式
//比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
//静态私有成员,没有初始化
private static LazySingleton instance =null;
private LazySingleton(){
//构造私有函数
}
private static synchronized LazySingleton getInstance(){ //静态,同步,公开访问点
if (instance==null) {
instance=new LazySingleton();
}
return instance;
}
}

关键点

关键点:(代码注释上已给出)

  • 构造函数定义为私有—不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
  • 成员变量为static的,没有初始化—类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
  • 公开访问点getInstance:public和synchronized的—public保证对外公开,synchronized同步保证多线程时的正确性(因为类变量不是在加载时初始化的)

###饿汉式单例模式
饿汉模式代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package singleton;
public class Singleton1 {
//饿汉单例模式
//类加载时就完成了初始化,所以类加载比较慢,但是获取对象的速度快
//静态私有成员,已初始化
private static final Singleton1 instance =new Singleton1();
private Singleton1(){
//私有构造函数
}
public static Singleton1 getInstance(){
return instance; //静态,不用同步(类加载时已初始化,不会有多线程的问题)
}
}

关键点

关键点:(代码注释上已给出)

  • 构造函数定义为私有—不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
  • 静态私有成员–在类加载时已初始化
  • 公开访问点getInstance—–不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回

More info: 更多