Java开发——41.设计模式_单例(Singleton)模式

简介: 设计模式_单例(Singleton)模式

什么是设计模式?

大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。(设计模式就是像是取最优的模板一样,类似英文作文模板。)


学习设计模式的目的:

使得开发项目更加容易扩展和维护,解决方式就是一个“分工”;在不改变原有代码的基础上实现扩展操作。


现阶段学习的设计模式仅做了解的设计模式:

单例模式(Singleton)是需要掌握的!!!

模板方法设计模式(TemplateMethod)/代理模式(Proxy)有些相像,学习的时候注意区分;

工厂模式,又分为了三大类,所以区别学习,注意抽象工模式涉及反射的内容,后续再补充...

image.png


单例模式(Singleton):

采用一定的方法保证在整个软件系统中对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法


拆解主要内容:


对某个类只能存在一个对象实例->private类名(){} ->私有化构造器该类只提供一个取得其对象实例的方法->提供一个可以返回该对象的方法1.创建类2.私有化类的构造器3.创建一个类对象并将类封装起来4.创建一个能返回该类对象的方法5.必须保证该方法能通过类名获取到->声明为static方法->推断得第四步为static修饰的对象


饿汉式:

天然的线程安全,所以如下写法就是最标准的形式。


publicclassDemoSingleton {
publicstaticvoidmain(String[] args) {
Bank.getInstance();
    }
}
//1.创建类classBank{
//2.私有化构造器privateBank(){
    }
//3.创建一个类对象并将类封装起来//5.因为静态方法只能使用静态的变量,所以该实例化对象也必须声明为static的privatestaticBankinstance=newBank();
//4.创建一个能返回该类对象的方法//我们需要这个方法返回该类的实例化对象,需要声明该方法为static,可以通过类名调用publicstaticBankgetInstance(){
returninstance;
    }
}


饿汉式的好处:线程安全的;

饿汉式的缺点:对象的加载时间长,可能在调用getInstance()的时候才需要创建对象,但是在调用getInstance()前对象就是已存在。


懒汉式:

下面这种写法是存在安全隐患的,最为安全需要加上线程同步(synchronized)!


publicclassDemoSingleton {
publicstaticvoidmain(String[] args) {
Bank.getInstance();
    }
}
//1.创建类classBank{
//2.私有化构造器privateBank(){
    }
//3.创建一个类对象并将类封装起来//5.因为静态方法只能使用静态的变量,所以该实例化对象也必须声明为static的privatestaticBankinstance=null;
//4.创建一个能返回该类对象的方法//我们需要这个方法返回该类的实例化对象,需要声明该方法为static,可以通过类名调用publicstaticsynchronizedBankgetInstance(){//此时同步监视器就是Bank.classif (instance==null) {
instance=newBank();
        }
returninstance;
/*public static  Bank getInstance(){//这种效率会相对高一点,因为如果instance != null后,后续的线程就可以直接拿到对象,不用在抢占锁了if (instance == null) {synchronized (Bank.class) {if (instance == null) {instance = new Bank();}}}return instance;}*/}


懒汉式的好处:延迟对象的创建;

懒汉式的局限:天然的线程不安全,需要后续进行线程同步。


饿汉式和懒汉式在面试的时候可能会让手写代码所以建议掌握!!!

另外,饿汉式是天然线程安全的,所以不用额外担心安全隐患的问题;但是在书写懒汉式要保证线程安全!!!

相关文章
|
4天前
|
设计模式 Java
【JAVA基础篇教学】第十四篇:Java中设计模式
【JAVA基础篇教学】第十四篇:Java中设计模式
|
6天前
|
存储 Java 数据库连接
使用Java开发桌面应用程序
使用Java开发桌面应用程序
15 0
|
6天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
14 0
|
6天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
11 0
|
6天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
52 0
|
6天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
10 0
|
6天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
17 0
|
6天前
|
监控 Java Maven
揭秘Java Agent技术:解锁Java工具开发的新境界
作为JDK提供的关键机制,Java Agent技术不仅为Java工具的开发者提供了一个强大的框架,还为性能监控、故障诊断和动态代码修改等领域带来了革命性的变革。本文旨在全面解析Java Agent技术的应用场景以及实现方式,特别是静态加载模式和动态加载模式这两种关键模式。
34 0
|
7天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
21 1
探索Java开发中触发空指针异常的场景
|
7天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
98 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式