单例模式
要点:
1.某个类只能有一个实例
2.必须自行创建实例
3.必须自行向整个系统提供这个实例
实现:
1.只提供私有的构造方法
2.含有一个该类的静态私有对象
饿汉式:
- 创建对象实例的时候直接初始化
- 空间换时间
- 在类加载的时候就创建实例
懒汉式:
- 类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
- 时间换空间
- 第一次使用时进行实例化
== 饿汉式线程安全 ==
== 懒汉式存在线程风险 ==
饿汉式:
//饿汉式:创建对象实例的时候直接初始化
//空间换时间
//在类加载的时候就创建实例
public class SingletonOne {
//1.创建类中的私有构造
private SingletonOne()
{
}
//2.创建该类型的私有静态实例
private static SingletonOne instance = new SingletonOne();
//3.创建公有静态方法返回静态实例对象
public static SingletonOne getInstance(){
return instance;
}
}
懒汉式:
//懒汉式:类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
//时间换空间
//第一次使用时进行实例化
public class SingtonTwo {
//创建私有构造方法
private SingtonTwo(){
}
//2.创建静态的该类的实例对象
private static SingtonTwo instance = null;
//创建开放的静态方法提供实例对象
public static SingtonTwo getInstance(){
if(instance == null)
{
instance = new SingtonTwo();
}
return instance;
}
}
测试:
public class Text {
public static void main(String[] args) {
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one == two);
System.out.println(one);
System.out.println(two);
SingtonTwo one1 = SingtonTwo.getInstance();
SingtonTwo one2 = SingtonTwo.getInstance();
System.out.println(one1 == one1);
System.out.println(one1);
System.out.println(one2);
}
}
==================================================================
true
day06.SingletonOne@4554617c
day06.SingletonOne@4554617c
true
day06.SingtonTwo@74a14482
day06.SingtonTwo@74a14482