單例模式

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

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

簡單的對比就是:

例如,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. [题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array

    [题目] D. Changing Array [描述] 给n个整数a[1],...,a[n],满足0<=a[i]<=2^k-1.Vanya可以对这n个数中任一多个数进行操作,即将x变为x' ...

  2. IP网络主动测评系统——IT运维人员的好帮手

    一.前 言 随着计算机网络的普及和快速发展,互联网已经融入到人们的衣食住行等方方面 面,如工作.购物.音视频聊天.视频会议.朋友圈.抖音.在线网游.网络电影 电视等.毫不夸张地说,现如今大部分人的绝大 ...

  3. nmtui解决network-scripts目录下无网卡对应配置文件问题

    1.问题出现的原因设备先安装了操作系统,后插上网卡到设备,就会出现/etc/sysconfig/network-scripts目录下无该网卡对应配置文件的问题,但是ifconfig命令能看见系统给该网 ...

  4. C#源代码的组成

    引用 using  ...表达式  i=5.i>5 语句:int i=5: 快( block ):{ }

  5. Spark分区数、task数目、core数目、worker节点数目、executor数目梳理

    Spark分区数.task数目.core数目.worker节点数目.executor数目梳理 spark隐式创建由操作组成的逻辑上的有向无环图.驱动器执行时,它会把这个逻辑图转换为物理执行计划,然后将 ...

  6. JZ-049-把字符串转换成整数

    把字符串转换成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 返 ...

  7. 2022年官网下安装Logstash最全版与官网查阅方法(8.1.0最新安装)

    一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 相关文章推荐 NodeJS 16.0.0 https://www.cnblogs.com/liuyangfirst/p/15998172.h ...

  8. java方法学习

    java方法学习 方法概念 什么是方法 方法就是完成某些事情的过程,如:实现两个数相加,用方法add(数值1,数值2). 1.System.out.print(),System是系统的一个类,out是 ...

  9. CentOS8时间同步

    CentOS8中默认已经不再支持ntpd软件包,同时也无法通过官方软件仓库安装, CentOS8上使用Chrony配置NTP服务器,用于同步时间. 它有两个程序,chrony和chronyd, chr ...

  10. CF258D题解

    太厉害啦 首先做期望题最不能忘记的就是期望的线性性. 所以我们直接将全局逆序对对数拆成两个数其中一个比另一个大的期望(概率),设为 \(f[i][j]\),初值为 \([a_i>b_j]\). ...