23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第1张图片


每博一文案

世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了。
但当我们咬牙坚持过那段难熬的时光后,发现并没有想象中的那么难,就像村上春树说的一句话:每个人
的生命中都有最艰难的那一年,等你迈过去了,人生就会变得高远,辽阔,生活总是泥沙俱下,每个看似百毒不侵的
成年人,都有无数次绝望和崩溃的时刻,要走的路已经选定了,该怎么走,走多久,都是命中注定的,走多久都是命中注定。
在一切变好之前,我们总要经历一段不开心的日子。这段日子也许很长,也许只是一觉醒来,人只有不断地经历,跌倒后,
才能顽强与坚毅的性格。
作家三毛说过这样一句话:世间的人和事,来和去都有它的时间,我们只需要把自己修炼成最好的样子,然后静静地去等待就好了。
人生在世,每个人,都有自己的困境,每个人都有自己的深渊,每个人都有可能摔进去,但每个生命都有属于自己绽放时刻。
这一生挫折会来,也会过去,热泪会留下,也会收起,每个阳光下开怀大笑的人,都有一段沉默的时光。
当我们走过难熬的岁月。回首往昔,当初的脆弱,早已变成勇敢,成为了我们攻坚克难的坚硬的铠甲。
愿你纵使孤身一人,也可以将这场生命旅程走得光灿明亮,自由坦荡。
                                                    ——————   一禅心灵庙语

文章目录

  • 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
    • 每博一文案
    • 1. 单例设计模式
      • 1.1 单例设计模式的优点
      • 1.2 单例设计模式的应用场景
    • 2. 单例设计模式:饿汉式
      • 2.1 饿汉式的优缺点:
    • 3. 单例设计模式:懒汉式
      • 3.1 懒汉式的优缺点:
    • 4. 总结:
    • 5. 最后:


1. 单例设计模式

设计模式: 是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去了我们自己再思考和摸索。就像经典的棋谱,不同的棋局,我们用不同的棋谱,”套路“,也像数学中的公式,不同的问题使用不同的套用不同的公式。

所谓类的单例设计模式 : 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象的实例的方法。

如果我们要让在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为 private ,这样,就不能用 new 操作符

在类的外部产生 类的对象了。但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象(因为我们把构造方法权限改为了 private) ,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

常见的单例设计模式的类:Runtime

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第2张图片


单例设计模式有两个实现的方式:饿汉式 和 懒汉式

1.1 单例设计模式的优点

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决,比如:数据库连接池。一个应用只需要一个数据库连接池就足够了。

1.2 单例设计模式的应用场景

网站的计数器: 一般也是单例模式实现,否则难以同步。

应用程序的日志应用: 一般都使用单例模式实现,这一般是由于共享的日志文件,一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

数据库连接池的设计: 也是采用单例模式,因为数据库连接是一种数据库资源。

项目中读取配置文件的类 ,一般也只有一个对象,没有必要每次使用配置文件数据,都生成一个对象去读取。

Application 也是单例的典型应用。

Windows 的 **Task Manager(任务管理器)**就是很典型的单例模式

WindowsRecycle Bin(回收站) 也是典型的单例应用,在整个系统运行过程中,回收站一直维护着仅有的一个实例。

2. 单例设计模式:饿汉式

饿汉式的实现方式一:

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();

        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }

    // 内部创建实例化对象
    //必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已,如果不是静态的创建一个对象就创建一个了。
    private static Bank instance = new Bank();

    // 提供公共静态的方法,返回当前类的对象(因为对应的属性是静态的了,方法也要是静态的)
    public static Bank getInstance() {
        return instance;
    }
}

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第3张图片

因为获取的对象都是来自同一个地方。所以地址是一样的


饿汉式实现的方式二: 不提供,公共的静态方法,将创建的对象public 公开化。

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.instance;
        Bank bank2 = Bank.instance;

        // Bank.instance = null; // fianl 无法修改
        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }

    // 内部创建实例化对象
    // 必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已
    // 注意附加上 final 防止外部访问修改为了 null,
    public static final Bank instance = new Bank();

    // 提供公共静态的方法,返回当前类的对象

}

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第4张图片


2.1 饿汉式的优缺点:

  • 优点: 线程安全
  • 缺点: 对象加载时间过长

3. 单例设计模式:懒汉式

懒汉式实现如下:

package blogs.blog2;

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();

        // Bank.instance = null; // fianl 无法修改
        System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
    }
}

// 饿汉式方式以
class Bank{
    // 构造器私有化,不然外部调用
    private Bank() {

    }


    // 静态的好通过 类名直接调用
    // 注意附加上 final 防止外部访问修改为了 null,
    private static Bank instance = null;

    // 提供公共静态的方法,返回当前类的对象
    public static Bank getInstance() {
        if(instance == null) {  // 当 instance 为 null 的时候,就创建新的不是空就不创建新的对象
            // 内部创建实例化对象
            instance = new Bank();
        }
        return instance;
    }

}

23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第5张图片


3.1 懒汉式的优缺点:

  • 优点: 延迟对象的创建,有需要就创建
  • 缺点: 目前的方式,存在线程不安全问题

4. 总结:

  1. 单例设计模式:就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象的实例的方法。
  2. 单例设计模式两种表现形式:饿汉式 VS 懒汉式
  3. 单例设计模式注意使用 static 修饰实例变量,静态的和类一起加载到内存(方法区)当中,仅仅只加载一次,所有对象共有。
  4. 注意饿汉式的第二种实现的方式:使用 final 关键字,防止被外部调用修改置为了 null

5. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后悔有期,江湖再见!!!


23种设计模式:单例设计模式(饿汉式 VS 懒汉式)_第6张图片

你可能感兴趣的:(23设计模式,设计模式)