单例模式
单例设计模式
饿汉单例模式
饿汉单例模式的实现步骤
1.将构造器私有
2.new一个对象并用SingleInstance记录,创建类的对象,并定义一个静态变量记住这个对象
3.定义一个public的get方法,返回上面创建的对象
一个类只需要创建一个对象 ; 只能创建一个对象;
1.类的构造器私有
private SingleInstance(){
}
- 创建类的对象, 并定义一个静态变量记住这个对象
static SingleInstance singleInstance=new SingleInstance();
- 返回创建的对象
public static SingleInstance getSingleInstance(){
return singleInstance;
}
饿汉单例模式—示例代码
/**
* 用途:
*
* @author : lqq
*/
public class SingleInstance {
//1.将构造器私有
private SingleInstance(){
System.out.println("执行了Task222的无参构造");
}
//2.new一个对象并用SingleInstance记录,创建类的对象,并定义一个静态变量记住这个对象
static SingleInstance singleInstance=new SingleInstance();
//3.定义一个public的get方法,返回上面创建的对象
public static SingleInstance getSingleInstance(){
return singleInstance;
}
}
懒汉单例模式
懒汉单例模式设计步骤:
1.定义一个类,把构造器私有
2.定义一个用于记住当前对象的静态变量,并赋值为null
3.提供一个返回单例对象的方法
懒汉单例模式—示例代码
public class Singleton {
//2.定义一个用于记住当前对象的静态变量,并赋值为null
private static Singleton singleton = null;
// 1.定义一个类,把构造器私有
private Singleton(){
}
//3.提供一个返回单例对象的方法
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
优缺点
优点: 减少了内存开销, 但是需要注意JVM垃圾处理程序, 可以系统全局设置访问点, 例如设置单例类, 负责所有数据表的映射处理.
缺点:扩展困难, 对单元测试不利,
使用场景
● 要求生成唯一序列号的环境;
● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。
小结:
1.饿汉模式:
在加载字节码码初始化的阶段就开始new对象, 给人一种迫不及待的感觉, 所有叫做饿汉模式;
2.懒汉模式:
对于是否new对象, 会先进行一个判断, 如果堆空间里面存在一个该类的实例, 那就不会new, 直接返回这个类对象;在使用这个类对象的时候才开始判断是否要new这个对象, 给人一种懒散的感觉, 所有称作懒汉模式;
3.两个汉的对比:
-
私有构造
-
static 对象类型 变量名= 【a或者b】
变量定义对象或接受对象a.饿汉模式 —再此new对象
b.懒汉模式 —定义为null
-
public static getInstance()方法 给外界一个获取实例的接口
a. 直接返回static 定义的对象
b.判断static定义的变量是否为空, 不为空直接返回static定义的对象变量; 如果不是空, 先new出对象, 再返回;
4.饿汉单例
public class Singleton {
//限制产生多个对象
private Singleton(){
}
//静态变量接受对象
private static final Singleton singleton = new Singleton();
//通过该方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}
5.懒汉单例
public class Singleton{
//构造器私有
private Singleton(){
}
//静态变量接收实例对象, 这里是懒汉模式,对象的获取需要判断
private static final Singleton singleton = null;
//public static getSingleton方法给外界获取该实例, 懒汉模式需要判断对象是否为空
public static Singleton getSingleton(){
if(singleton == null){
singleton =new Singleton();
return singleton;
}
return singleton;
}
}