java23种模式之单例模式
JAVA23种设计模式四——单例模式
单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
什么是单例模式?
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
也就是说,在整个程序空间中,该类只存在一个实例对象。
GoF对单例模式的定义:
保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
为什么要使用单例模式?
对于系统中的某些类来说,只有一个实例很重要。比如:一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。在多线程之间,比如servlet环境,共享一个资源或者操作同一个对象,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例模式。
单例模式的三个要点:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
具体一点就是:
一是单例模式的类只提供私有的构造函数;
二是类定义中含有一个该类的静态私有对象;
三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。
一般Singleton模式通常有三种形式:
第一种:饿汉式
// MainClass.java
public class MainClass {public static void main(String[] args){Person per=Person.getPerson();Person per2=Person.getPerson();per.setName("张三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());}
}
// Person.java
public class Person {public static final Person person=new Person();// 保证该类里只有一个实例private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}// 构造函数私有化private Person(){}// 提供一个全局的静态方法public static Person getPerson(){return person;}
}
第二种:懒汉式
// MainClass.java
public class MainClass {public static void main(String[] args){Person2 per=Person2.getPerson();Person2 per2=Person2.getPerson();per.setName("张三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());}
}
// Person2.java
public class Person2 {// 保证该类里只有一个实例private String name;// 声明一个静态的personprivate static Person2 person;public String getName() {return name;}public void setName(String name) {this.name = name;}// 构造函数私有化private Person2(){}// 提供一个全局的静态方法public static Person2 getPerson(){// 在这里需要加一个判断,否则在主方法里会产生两个不同的对象if(person==null){person=new Person2();}return person;}
}
结果还是:李四
李四
在上面Person2.java代码中,适用于单线程的情况,不适用多线程,要想适用多线程,需将相应代码修改为:
// 提供一个全局的静态方法,使用同步方法public static synchronized Person2 getPerson(){// 在这里需要加一个判断,否则在主方法里会产生两个不同的对象if(person==null){person=new Person2();}return person;}
这种做法又致使效率大大降低,因为每次获取对象时,都要进行同步!
第三种:双重检查
// MainClass.java
public class MainClass {public static void main(String[] args){Person3 per=Person3.getPerson();Person3 per2=Person3.getPerson();per.setName("张三");per2.setName("李四");System.out.println(per.getName());System.out.println(per2.getName());}
}
// Person3.java
public class Person3 {// 保证该类里只有一个实例private String name;// 声明一个静态的personprivate static Person3 person;public String getName() {return name;}public void setName(String name) {this.name = name;}// 构造函数私有化private Person3(){}// 提供一个全局的静态方法public static Person3 getPerson(){// 双重检查,效率大大提高if(person==null){synchronized (Person3.class){if(person==null){person=new Person3();}}}return person;}
}
这种模式大大提高了执行效率,不必每次获取对象时都进行同步,只是第一次需要进行同步。
java23种模式之单例模式相关推荐
- Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解
源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...
- Java23种设计模式之单例模式
单例模式 前言 一.单例模式特点 二.单例模式的优点 三.单例模式的缺点 四.饿汉式单例模式 五.懒汉式单例模式 总结 前言 单例模式(Singleton Pattern)是 Java 中最简单的设计 ...
- 走穿java23种设计模式-15责任链模式详解
走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...
- 走穿java23种设计模式--18中介者模式详解
走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...
- java23种设计模式+单例_Java23种设计模式之单例模式
一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点: 1.单例类只能有一个实例: 2.单例类必须自己创建自己的唯一的实例: ...
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...
- java23种设计模式面试常被问到的单利模式讲解
最近在学习软件工程中的设计模式,学一个总结一个. 方便自己,方便他人. 概念 单例模式指的是一个类只有一个实例对象,且这个类能自行创建这个实例对象的一种模式.比如,我们的Windows 系统只能打开一 ...
- java23种开发模式
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式。
23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式. 1. 随处可见的模板模式 2. 暗含讲究的工厂方法模式 3. 单例模式隐含的坑你能看到第几层? 视频讲解如下,点击观看: [干货篇]23种 ...
最新文章
- 网易严选 x 网易有数:数据产品+数据中台双引擎模式实践
- Typora添加右键新建Markdown文件
- Linux程序映像的布局
- 导入jQuery库时应该注意的问题
- 安装完毕freebsd的后续工作,安全设置及其他(适合新手)
- centos 修改语言、时区
- 100%测试覆盖率真的有用吗?
- 安装SQL2K,当创建挂起文件操作之后...
- JQuery中的ID选择器
- Java总结:正则表达式进行校验
- 计算机网络考试试题库-期末考试题库含答案
- [BalticOI2002]Bicriterial routing
- iphone NSString 字符串处理:截取字符串、匹配字符串、分隔字符串
- MathType初级教程:怎么安装MathType
- matlab案例 光学,利用Matlab 仿真光学实验
- 我花了20年研究华为,发现了这些秘密……
- Mac SpotLight无法搜索
- 论文摘要部分如何撰写
- 虚拟DOM 之 Snabbdom 一、基本介绍
- 测绘程序设计——度分秒与弧度制转化(C#)