单例模式的要点有三个:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
具体的实现方法:
一,是单例模式的类只提供私有的构造函数, 二,是类定义中含有一个该类的静态私有对象,
三,是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
使用场景:
对象需要频繁的实例化和销毁,此时考虑使用单例可以大大的提高性能
优点:1.由于只有一个实例对象,所以占用内存很少
2.对象不用重复new了,当然于解放了对资源的重复占 用,提升了性能
缺点:1.扩展性差了,想扩展每次都得改代码
2.使用的场景比较单调,如果是在多场景不断变化的实例对象最好不要使用单例,数据容易出问题
3.最好不要用到连接池那块,N多对象共享一个连接池,容易导致连接池溢出的
//单例模式-----懒汉式
public class SingleLton {
private static SingleLton instance=new SingleLton02();
//私有化构造函数
private SingleLton() { }
//提供静态方法,让外界通过类.方法名的方式调用方法来实例化
//调用一次实例化一次
public static SingleLton getInstance() {
return instance;
}
}
//单例模式----饿汉式
//注:线程不安全模式:只可教学使用,否则会出现严重的安全问题
class Single {
//私有化构造器
private Single() { }
//提供静态化的实例
private static Single instance;
//不提供锁的安全机制,如果多线程调用时会出现重复使用的情况
public static Single getInstance() {
if(instance!=null) {
instance=new Single();
}
return instance;
}
}
//线程安全模式,提供了同步监视器来防止重用的情况
public class SingleLton {
private static SingleLton instance;
//私有化构造函数
private SingleLton() { }
//DCL双检查锁机制
//提供同步监视器(锁)来实现多线程的安全机制
public static SingleLton getInstance() {
if(null==instance) {
synchronized (SingleLton.class) {//类锁
if(null==instance) {
instance=new SingleLton();
}
}
}
return instance;
}
}