單例模式

一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

一个类只有一个实例,且该类能自行创建这个实例的一种模式。

簡單的對比就是:

例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,
或出现各个窗口显示内容的不一致等错误。

特點

单例类只有一个实例对象;
该单例对象必须由单例类自行创建;
单例类对外提供一个访问该单例的全局访问点。

應用場景

需要频繁创建的一些类,使用单例可以降低系统的内存压力,减少 GC。

某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。

某些类创建实例时占用资源较多,或实例化耗时较长,且经常使用。

某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。

频繁访问数据库或文件的对象。

对于一些控制硬件级别的操作,或者从系统上来讲应当是单一控制逻辑的操作,如果有多个实例,则系统会完全乱套。

当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。
如 Web 中的配置对象、数据库的连接池等

實現步驟:

在类中添加一个私有静态成员变量用于保存单例实例。

声明一个公有静态构建方法用于获取单例实例。

在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 
此后该方法每次被调用时都返回该实例。 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。

懶漢式的單例模式

/**
* 懶漢式單例設計模式
*
* 特點;'类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
*
*/
public class LaziSingleton {
//volatile,若变量发生变化,这同步到所有的线程中。
private static volatile LaziSingleton instance =null;
//私有有構造函數
private LaziSingleton(){} public static synchronized LaziSingleton getInstance(){
if (instance == null){//如果對象還沒有被創建,那就新建一個實列
instance = new LaziSingleton();
}
return instance;
}
/**
* 编写的是多线程程序,则不要删除上例代码中的关键字 volatile
* 和 synchronized,否则将存在线程非安全的问题。
*/
}

餓漢式的單例模式

/**
* 餓漢式單例
*
* 特點:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了
*/
public class HungrySingleton {
//加載的時候就創建實列
private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){} private static HungrySingleton getInstance(){
return instance;
}
/**
* 在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,
* 所以是线程安全的,可以直接用于多线程而不会出现问题。
*/
}

簡單實踐驗證

建立一個單例模型的類:

/**
* 单例模式
*/
public class President { //volatile,若变量发生变化,这同步到所有的线程中。
private static volatile President instance = null; /**
* 私有化构造函数,避免使用new创建的实例
*/
private President(){
System.out.println("new a President");
} /**
* synchronized关键字作用:保证方法或者代码在运行时,得到锁。
* 统一时刻只有一个方法执行。保证共享变量内存可见性
* 可见性
* @return
*/
//运行该方法的时候只有一个线程能够得到锁。避免出现创建两个实例的情况
public static synchronized President getInstance() {
if (instance == null){
instance = new President();
}else {
System.out.println("exist a President");
}
return instance;
} //
public void something(){
System.out.println("president--end");
}
}

測試代碼:

public class SingletonTest {
public static void main(String[] args) {
President president1 = President.getInstance();
President president2 = President.getInstance();
president1.something();
president2.something(); /**
* 判断是否为同一实例
*/
if (president1 == president2){
System.out.println("president1 == president2");
}else {
System.out.println("president1 != president2");
}
}
/**
new a President
exist a President
president--end
president--end
president1 == president2
*/
}

java-設計模式-單例模式的更多相关文章

  1. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  2. 面嚮對象程序設計第一單元作業——OO初試

    一.三次作业情况简介 第一次:本次作业仅涉及简单的常数和幂函数的加减法.要求在正确输入下给出正确的求导结果,对错误输出报错 第二次:本次作业涉及常数.幂函数和标准正余弦函数的相乘和相加减,难度较上回作 ...

  3. 悟空模式-java-单例模式

    [那座山,正当顶上,有一块仙石.其石有三丈六尺五寸高,有二丈四尺围圆.三丈六尺五寸高,按周天三百六十五度:二丈四尺围圆,按政历二十四气.上有九窍八孔,按九宫八卦.四面更无树木遮阴,左右倒有芝兰相衬.盖 ...

  4. Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式

    链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...

  5. java单例模式和双例模式

    今天朋友找我给做道题,双例模式,我是没听说过,都说是单例模式和多例模式, 也不知道双例模式什么时候用,就简单写了一个案例,不知道对不对,个人感觉蛮对的,双例就是单例+单例,废话不说了!!!! /* * ...

  6. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  7. JAVA设计模式——第 4 章 多例模式【Multition Pattern】(转)

    一个国家有多个皇帝这种情况有没有?还确实有,就出现在明朝,那三国期间的算不算,不算!因为各自称帝,各有各的地盘,国号不同.大家还记得那首诗<石灰吟>吗?作者是谁?于谦,他是被谁杀死的?明英 ...

  8. java设计模式——多例模式

    ★ 缓存在单例中的使用    缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通 常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放单例对象的类. 说明:该 ...

  9. Java多例模式

    多例模式又划分为有上限多例模式和无上限多例模式两种,没上限的多例模式和直接 new 一个对象没什么差别,此处不做记录. 有上限多例模式:实际上是单例模式的推广,如果它的上限是1,那么就成了单例模式了. ...

随机推荐

  1. RENIX使用模板创建报文——网络测试仪实操

    一.简介 RENIX内置多种报文模板,可以直接用来创建一个报文,节省时间 二.操作步骤 1.准备工作:连接机框,占用端口 2.新建或者编辑流 3.切换到 数据包/编辑 界面:点击创建新协议报文 4.在 ...

  2. Redis 7.0 新功能新特性总览

    说明:本文根据Redis 7 RC2 的release note 整理并翻译 近日,Redis 开源社区发布了7.0的两个预览版.在这两个预览版中,有很多Redis 7.0中新增加的特性,新增加的命令 ...

  3. PyTorch深度学习实践——处理多维特征的输入

    处理多维特征的输入 课程来源:PyTorch深度学习实践--河北工业大学 <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili 这一讲介绍输入为多维数据时的分类. 一个数据集 ...

  4. elementUI日期选择器 el-date-picker根据所选日期选择禁用

    我遇到这样一个场景,需要动态渲染时间表单,但是后端传过来的数据, 这个时候就不能预先找到想要限制的date了,因为连date本身,也是根据后端传来的数据生成的. 如图: 代码如下: //templat ...

  5. CV之各种不熟悉但比较重要的笔记

    解析: skip connection 就是一种跳跃式传递.在ResNet中引入了一种叫residual network残差网络结构,其和普通的CNN的区别在于从输入源直接向输出源多连接了一条传递线, ...

  6. iptables使用详解(centos7)

    安装前 里面有iptables的命令 [root@mcw01 ~]$ rpm -qa|grep iptables iptables-1.4.21-18.0.1.el7.centos.x86_64 [r ...

  7. Python中的super().__init__()

    Python里的super().init()有什么用? 简单的说super().__init__(),就是继承父类的init方法,同样可以使用super()去继承其他方法. 下面是三种不同的继承.调用 ...

  8. linux shell编程流程控制

    条件选择 单分支条件 多分支条件 选择执行if语句 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 f ...

  9. Linux-系统启动与MBR扇区修复

    目录 1.系统启动过程 1.1 MBR扇区 1.2 MBR扇区的备份与还原 1.3 修复MBR 1.3.1 dd备份MBR信息 1.3.2 光驱启动修复 1.4 grub引导代码修复 1.系统启动过程 ...

  10. laravel 和 tp的区别

    https://www.cnblogs.com/xiaoyantongxue/p/15442844.html laravel    数据库储存的时间字段 created_at  updated_at ...