zoukankan      html  css  js  c++  java
  • Java设计模式之单例模式

    一、概述

    单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。属于设计模式三大类中的创建型模式
    单例模式具有典型的三个特点

    • 只有一个实例。
    • 自我实例化。
    • 提供全局访问点。

    UML结构图非常简单,就只有一个类,如下图:

     
     

    二、优缺点

    • 优点:由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。
    • 缺点:也正是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有抽象类,这样扩展起来有一定的困难。

    三、常见实现方式

    常见的单例模式实现方式有五种:饿汉式懒汉式双重检测锁式静态内部类式枚举单例。而在这五种方式中饿汉式懒汉式又最为常见。下面将一一列举这五种方式的实现方法:

    • 饿汉式线程安全,调用效率高。但是不能延时加载。示例:
    public class SingletonDemo1 {
    
        //线程安全的
        //类初始化时,立即加载这个对象
        private static SingletonDemo1 instance = new SingletonDemo1();
    
        private SingletonDemo1() {
        }
    
        //方法没有加同步块,所以它效率高
        public static SingletonDemo1 getInstance() {
            return instance;
        }
    }
    

    由于该模式在加载类的时候对象就已经创建了,所以加载类的速度比较慢,但是获取对象的速度比较快,且是线程安全的。

    • 懒汉式线程不安全。示例:
    public class SingletonDemo2 {
    
        //线程不安全的
    
        private static SingletonDemo2 instance = null;
    
        private SingletonDemo2() {
        }
    
        //运行时加载对象
        public static SingletonDemo2 getInstance() {
            if (instance == null) {
                instance = new SingletonDemo2();
            }
            return instance;
        }
    
    }
    

    由于该模式是在运行时加载对象的,所以加载类比较快,但是对象的获取速度相对较慢,且线程不安全如果想要线程安全的话可以加上synchronized关键字,但是这样会付出惨重的效率代价。

    • 懒汉式(双重同步锁)
    public class SingletonDemo3 {
    
        private static volatile SingletonDemo3 instance = null;
    
        private SingletonDemo3() {
        }
    
        //运行时加载对象
        public static SingletonDemo3 getInstance() {
            if (instance == null) {
                synchronized(SingletonDemo3.class){
                     if(instance == null){
                         instance = new SingletonDemo3();
                     }
                }
            }
            return instance;
        }
    
    }
    

    由于剩下的几种实现方式暂没有接触过,可暂时参考一张图搞定Java设计模式,单例模式

    :注意单例模式所属类的构造方法是私有的,所以单例类是不能被继承的

    四、常见应用场景

    • 网站计数器。
    • 项目中用于读取配置文件的类。
    • 数据库连接池。因为数据库连接池是一种数据库资源。
    • Spring中,每个Bean默认都是单例的,这样便于Spring容器进行管理。
    • Servlet中Application
    • Windows中任务管理器,回收站。
      等等。


    作者:12313凯皇
    链接:https://www.jianshu.com/p/3f5eb3e0b050
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    获取地址栏的key-value形式的值(包括重复的key值)形成对象--重复的变成数组形式
    vue---定时循环setInterval
    动画效果----webkit-animation-----动画背景变化transition:background-color 1s linear;
    background-clip--背景是否填充
    box-sizing盒子的大小,修改文字种类而保持字体大小不变font-size-adjust,----块级和内联display---盒子阴影box-shadow---对盒子中容纳不下的内容的显示overflow
    地图api学习第一天
    文字添加阴影
    css循环样式: nth-child(n)
    es6语法
    将中国标准时间--转换为yyyy-MM-dd 时分秒
  • 原文地址:https://www.cnblogs.com/suger43894/p/12454568.html
Copyright © 2011-2022 走看看