zoukankan      html  css  js  c++  java
  • 23 种设计模式—单例模式

    一、单例模式概述

      单例模式(Singleton-Pattern)是 Java 中最简单的设计模式之一,这种类型的设计模式属于对象创建型模式。

      作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

     

    二、理解单例模式

      某些类创建对象是非常耗时耗内存和复杂的,这种类创建的对象我们称之为重量级对象(反之,轻量级对象),如果需要使用重量级类,一般把这个类设计为单例对象模式。

      单例对象模式好处有:

          1)保证对象在内存仅有一个,减少内存开销

          2)使用者不用考虑创建细节,使用方便

          3)可以控制对象的创建时刻

      代码实现单例模式的关键点:

        1)这个类在整个 JVM 中仅有一个对象实例

            Java 中对象的创建方式有:

              a)new 

              b)反射(reflect)

              c)反序列化(deserialize)

              d)克隆(clone)

        2)提供一个访问它的全局访问点

              a)公开的静态变量(不利于扩展)

              b)一个公开的静态方法,返回唯一实例

     

    三、实现单例模式方式

      (1)饿汉式:立即创建、线程安全

    package 饿汉式;
    
    public class SingletonClass {
        
        //私有静态变量,创建唯一实例   final:避免再次赋值(可加可不加)
        private static final SingletonClass ONLY=new SingletonClass();
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public static SingletonClass getInstance(){
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("恶汉式单例模式");
        }
    }

      

      (2)懒汉式:延时创建、线程不安全

    package 懒汉式;
    
    public class SingletonClass {
        
        //私有静态变量,保存唯一实例
        private static  SingletonClass ONLY;
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public  static SingletonClass getInstance(){
            if(ONLY==null){
                //...线程不安全
                ONLY=new SingletonClass();
            }
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("懒汉式单例模式");
        }
    }

    //缺点:多线程情况下不安全

      (3)加锁的懒汉式:延时加载、线程安全、同步情况下效率低

    package 加锁懒汉式;
    
    public class SingletonClass {
        
        //私有静态变量,保存唯一实例
        private static  SingletonClass ONLY;
    
        //私有构造方法,屏蔽外部的 new(外部无法访问此类)
        private SingletonClass(){}
        
        //一个公开的静态方法,返回唯一实例,提供一个全局的访问点
        public synchronized static SingletonClass getInstance(){
            if(ONLY==null){
                //...线程不安全(解决方案:synchronized)
                ONLY=new SingletonClass();
            }
            //...其他代码
            return ONLY;
        }
        
        public void f(){
            System.out.println("加锁懒汉式单例模式");
        }
    }

    //缺点:同步情况下效率低,即当
    SingletonClass 的对象已经被创建,多线程情况下因为有 synchronized 存在,还需要等待解锁。

     

    eclipse 中字母大小写转换快捷键:

        ctrl+shift+x   转为大写  

           ctrl+shift+y   转为小写

  • 相关阅读:
    Python之面向对象知识整理
    python2与python3的区别
    Gitlab 删除仓库文件夹
    Git撤销本地commit(未push)
    js库
    HTML | 打开网址后3秒跳转外链
    Vue CLI | 安装
    npm | npm淘宝镜像和查看镜像设置
    swiper | 过渡效果 effect: 'fade' 导致文字重叠
    CSS改变背景 | pattern.css
  • 原文地址:https://www.cnblogs.com/wxdestiny/p/9752267.html
Copyright © 2011-2022 走看看