基础知识(02) -- 单例模式

单例模式

  1.基本概念

  2.单例模式的定义

  3.单例模式中的角色

  4.单例模式延迟加载

  5.单例模式中使用静态内部类解决"懒汉式"和"饿汉式"带来的问题

  6.什么是类级内部类

----------------------------------------------------------------

1.基本概念:

  单例模式是设计模式中使用最普遍的模式了,它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

  使用单例模式可以带来两大好处:

    1.对于频繁使用的对象,可以省略创建对象所花费的时间

    2.由于new操作的次数减少,因而对系统内存的使用率也就降低了,这将减轻GC压力,缩短GC停顿时间

2.单例模式的定义:

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

3.单例模式中的角色:

  单例类: 提供单例的工厂,返回单例

  使用类: 获取并使用单例类 

下面代码是一个最简单的单例模式:

 1 /**
 2  * 演示最简单的单例模式(下面的写法在多线程环境下会有问题)
 3  */
 4 public class Singleton {
 5     private static Singleton instance = new Singleton();
 6
 7     private Singleton(){
 8         System.out.println("Singleton is create");
 9     }
10
11     public static Singleton getInstance(){
12         return instance;
13     }
14 } 

单例模式的核心在于通过一个接口返回唯一的对象实例

注意上面代码中加粗的部分:

  1.单例类必须要有一个private访问级别的构造函数

  2.instance成员变量和getInstance()方法必须是static的

4.单例模式中的延迟加载

先看看代码:

/**
 * 演示单例模式中的延迟加载
 * @author Administrator
 *
 */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton(){
        System.out.println("LazySingleton is create!");
    }

    private static synchronized LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

上面单例模式的代码实现中,虽然实现了延迟加载的功能,但却引入了同步关键之synchronized,因此在多线程环境中它的耗时会比较多。

5.单例模式中使用静态内部类解决"懒汉式"和"饿汉式"带来的问题

先看代码:

 1 public class StaticSingleton {
 2
 3     private StaticSingleton(){
 4         System.out.println("StaticSingleton is create");
 5     }
 6     //静态内部类
 7     private static class SingletonHoler{
 8         private static StaticSingleton instance = new StaticSingleton();
 9     }
10
11     public static StaticSingleton getInstance(){
12         return SingletonHoler.instance;
13     }
14 }

在上面的实现中,单例模式使用内部类来维护单例的实例,当StaticSingleton被加载时,其内部类并不会实例化,故可以确保StaticSingleton类被载入JVM时,不会初始化单例类,而当调用getInstance()方法 时,才会加载SingletonHoler,从而初始化instance,同时,由于实例的创建是在类加载时完成的,所以由JVM来保证多线程下的安全性,所以getInstance()方法也不需要使用同步关键字。

6.什么是类级内部类

  简单点说,类级内部类指的是: 有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。

  类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。

  类级内部类中,可以定义静态的方法。在静态方法中只能引用外部类中的静态成员方法或成员变量。

  类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。

时间: 2024-08-08 13:53:04

基础知识(02) -- 单例模式的相关文章

前端开发之html基础知识02

经典表格:表格没有列的概念,只有行的概念, 一行 tr,行中的单元格 td表头的突出显示:tr>th <table width="400px" align="center" border="1px" cellspacing="0" cellpadding="5px" > <!-- align = "center" 表格整体剧中--> <caption&

前端开发之CSS基础知识02

重要: 行内元素中只能容纳文本或其他的行内元素 a标签例外 文字类型的块标签,不要放其他块元素 如 P H1 CSS规范: .demo {} 空格 font-size: 12px; 空格 .a1, .a2, .a3 {} 空格 后代选择器或子代选择器最好不要超过三层 文字分为 顶线 中线 基线 底线 CSS特性: 层叠行:若冲突,按照最后的为准 CSS权重(重要): 标签 0.0.0.1 类选择器 0.0.1.0 id选择器 0.1.0.0 内联样式 1.0.0.0 !important 无穷大

MySQL基础知识02数据类型(二)数值相关类型

1.INT MySQL支持5中整数类型,每个整数类型又可以分为有符号整数和无符号整数. 类型 字节数 TINYINT 1 SMALLINT 2 MEDIUMINT 3 INT 4 BIGINT 8 1.1.2. DECIMAL(NUMERIC) MySQL使用DECIMAL表示定点数,NUMERIC是DECIMAL的一个别名. DECIMAL(5,2)表示这个定点数类型的整数和小数部分总共5位,其中3位是整数,2位是小数. DECIMAL的总位数最多65位,超出65则报错. mysql> cre

AI-图像基础知识-02

目录 图像坐标系 图像数字化 图像坐标系 ? ? 在前面的数据标注文章中讲述如何进行标注,而标注后会保留4个坐标点,那么这些坐标点如何表示在图片中的位置?要表示一个点或图形的位置,就需要涉及到坐标系的概念.今天就来了解一下图像的坐标系.一般大家首先接触到的坐标系应该是的笛卡尔坐标系,如下所示: ? ? 如下图所示,是以图像左上角为原点建立的以像素为单位的直角坐标系u-v.其横坐标u与纵坐标v分别是在其图像数组中所在的列数和行数. 以上坐标在OpenCV中,u对应 x , v对应 y ? ? 由于

ios基础知识--02

1.添加一个view init : 所有对象都可以调用 initWithFrame: 属于UI控件的实例化方法 2. // 设置属性:nameLabel.text = @"爸爸去哪儿"; // 设置对齐方式, 居中:nameLabel.textAlignment= NSTextAlignmentCenter; /** 设置字体: + (UIFont*)systemFontOfSize:(CGFloat)fontSize; 默认体 + (UIFont*)boldSystemFontOfS

3D基础知识——02 3D模型

学习笔记适合新手,如有错误请指正.?号处也请各位指点下,谢谢. Mesh网格模型 点击主菜单>Assets>Import Package>Characters,将资源包导入工程 将Constructer拖入场景,然后点击Scene标签下的Shaded按钮,选择渲染模式为Wireframe 观察此模式下的人物,大图部分会看的最清楚 Texture贴图 网格模型上每一个三角形顶点都对应着贴图上的一个坐标,囊而每一个三角形的中间部分可以通过对该三角形所有顶点插值得到贴图里的颜色 Materia

正则表达式基础知识02

回溯引用:前后一致匹配 回溯引用(backreference)在文本匹配和文本替换操作里非常有用. 例子1:匹配HTML中任意一级的标题栏中的内容例如:<h1>nihao</h1> 模式1:<[hH][1-6]>.*?</[hH][1-6]>  [注意这里使用懒惰型的*] 但是这里模式不是正确的:例如:<H2>abcd</H3> 显示不是正确的 模式2:<[hH]([1-6])>.*?</[hH]\1>   正

python基础知识0-2

# !/usr/bin/env python# -*- coding: encoding -*- # 提示输入用户名和密码 # 验证用户名和密码# 如果错误,则输出用户名或密码错误# 如果成功,则输出 欢迎,XXX! import getpassname = input('请输入用户名:')pwd =getpass.getpass('input your password')print(pwd) if name == "alex" and pwd == "cmd":

python基础知识02

数据类型及魔法值 1.数字 int int :将字符串转换为数字 bit_length:当前数字的二进制,至少用n位表示 2.字符串 str casefold:所有变小写,比lower功能强大 center:设置宽度,并将内容居中,空白内容填充可有可无 count:字符串中某个子序列出现的次数 endswith:判断字符串是否以某个子序列结尾 startswith:判断字符串是否以某个子序列开始 find:从开始往后找,找到第一个后,获取其位置 format:将一个字符串中的占位符替换为指定的值