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;}*/}


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

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


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

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

相关文章
|
2天前
|
设计模式 API
【设计模式】适配器和桥接器模式有什么区别
【设计模式】适配器和桥接器模式有什么区别
8 1
|
2天前
|
设计模式
【设计模式】张一鸣笔记:责任链接模式怎么用?
【设计模式】张一鸣笔记:责任链接模式怎么用?
11 1
|
2天前
|
设计模式 uml
【设计模式】建造者模式就是游戏模式吗?
【设计模式】建造者模式就是游戏模式吗?
11 0
|
2天前
|
设计模式 Java uml
【设计模式】什么是工厂方法模式?
【设计模式】什么是工厂方法模式?
7 1
|
2天前
|
设计模式 uml
【设计模式】一文搞定简单工厂模式!
【设计模式】一文搞定简单工厂模式!
8 2
|
2天前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
2天前
|
设计模式 Java
【JAVA基础篇教学】第十四篇:Java中设计模式
【JAVA基础篇教学】第十四篇:Java中设计模式
|
2天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
18 0
|
2天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
103 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
2天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
24 4