二十三种设计模式之【单例设计模式】

单例模式

单例设计模式

饿汉单例模式

饿汉单例模式的实现步骤

1.将构造器私有

2.new一个对象并用SingleInstance记录,创建类的对象,并定义一个静态变量记住这个对象

3.定义一个public的get方法,返回上面创建的对象

一个类只需要创建一个对象 ; 只能创建一个对象;

1.类的构造器私有

private SingleInstance(){
}
  1. 创建类的对象, 并定义一个静态变量记住这个对象
static SingleInstance singleInstance=new SingleInstance();
  1. 返回创建的对象
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.两个汉的对比:

  1. 私有构造

  2. static 对象类型 变量名= 【a或者b】 变量定义对象或接受对象

    a.饿汉模式 —再此new对象

    b.懒汉模式 —定义为null

  3. 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;
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值