1 单例模式
(1).介绍
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
(2)实例
public class Person {
// 创建 Person 的一个对象
private static Person person = new Person();
// 让构造函数为 private,这样该类就不会被实例化
private Person() {
}
// 获取唯一可用的对象
public static synchronized Person getPerson() {
if (person == null) {
person = new Person();
}
return person;
}
}
(3)测试
public class PersonTest {
public static void main(String[] args) {
// Person p=new Person();//不能被new,只能通过get获取
Person person = Person.getPerson();
}
}
(4)总结
构造函数是私有的;只有一个实例;没有接口
二 单例模式几种实现方式
(1)懒汉式,线程不安全
public class Person {
// 创建 Person 的一个对象
private static Person person = new Person();
// 让构造函数为 private,这样该类就不会被实例化
private Person() {
}
// 获取唯一可用的对象
public static Person getPerson() {
if (person == null) {
person = new Person();
}
return person;
}
}
(2)懒汉式,线程安全
public class Person {
// 创建 Person 的一个对象
private static Person person = new Person();
// 让构造函数为 private,这样该类就不会被实例化
private Person() {
}
// 获取唯一可用的对象
public static synchronized Person getPerson() {//同步 synchronized
if (person == null) {
person = new Person();
}
return person;
}
}
(3)饿汉式
public class Person {
// 创建 Person 的一个对象
private static Person person = new Person();
// 让构造函数为 private,这样该类就不会被实例化
private Person() {
}
// 获取唯一可用的对象
public static Person getPerson() {
// if (person == null) {
// person = new Person();
// }
return person;
}
}
(4)双检锁/双重校验锁
public class Person {
// 创建 Person 的一个对象
private static Person person = new Person();
// 让构造函数为 private,这样该类就不会被实例化
private Person() {
}
// 获取唯一可用的对象
public static Person getPerson() {
// if (person == null) {
// person = new Person();
// }
if (person == null) {
synchronized (Person.class) {
if (person == null) {
person = new Person();
}
}
}
return person;
}
}
(5)枚举
(6)登记式/静态内部类