单例模式是一种常用的设计模式,它的核心结构是只包含一个被称为单例的特殊类。
**优点:**确保只有一个实例,节约资源(避免频繁创建实例销毁实例,或者实例消耗内存过于大,可以用单例先预先生实例,在后期使用时,加载速度就快了。)
**缺点:**没有抽象类,不易于拓展。不适用与变化的对象
单例模式的要素:
a.私有构造方法;
b.私有静态引用指向自己实例;
c.以自己实例为返回值的公有静态方法。
单例模式的几种分类:
1:饿汉式:单例实例在类装载时就构建,急切初始化。预先加载。线程安全。
public class test {
private test() {
System.out.println("你好");
}
private static test single=new test();
public static test GetInstance() {
return single;
}
}
2:懒汉式:在第一次使用的时候构建,延迟加载。存在线程安全问题,可能会产生两个实例对象。
public class test{
private test() {
System.out.println("懒汉式");
}
private static test singleq=null;
public static test getInstance() {
if(singleq==null) {
singleq=new test();
}
return singleq;
}
}
3:完全同步方法:可以解决懒汉式线程不安全的问题,添加一个synchronized 关键字,
public static synchronized test getInstance() {
if(singleq==null) {
singleq=new test();
}
return singleq;
}
4部分同步方法(也叫双重检测方法):可以解决懒汉式线程不安全的问题,在判断实例为空之后,在进入关键字代码块,再次判断,保证每次只有一个线程在执行关键字代码块里面创建实例的代码。核心思想是在方法getInstance内有些代码可并行运行,有些可以串行运行。
public static test getInstance() {
if(singleq==null) {
synchronized(test.class) {
if(singleq==null) {
singleq=new test();
}
}
}
return singleq;
}
5静态内部类:程序第一次运行My.Single时,单例对象才动态生成。不执行getInstance方法,就不会被实例。优点是可以执行该类的其他静态方法也可以被执行。
public class test{
public static class My{
private static final test Single=new test();
}
private test() {
System.out.println("静态内部类");
}
public static final test getInstance() {
return My.Single;
}
}