当前位置: 首页 > article >正文

静态方法和属性的经典使用-单例设计模式

单例设计模式

  • 一、设计模式
  • 二、单例模式
    • 1、饿汉式
    • 2、懒汉式
    • 3、区别

单例设计模式是静态方法和属性的经典使用。

一、设计模式

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。

二、单例模式

单例:单个的实例

  1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
  2. 单例模式有两种方式 :① 饿汉式 ② 懒汉式

1、饿汉式

步骤
(1) 构造器私有化 =>防止直接new对象
(2) 类的内部创建静态对象(new)
(3) 向外暴露一个静态的公共方法getlnstance。
(4) 代码实现

public class SingleTon01 {
    public static void main(String[] args) {
        Wife instance = Wife.getInstance();
        System.out.println(instance);
    }
}
//有一个类,Wife
// 只能有一个Wife
class Wife{
    private String name;

    private static Wife wf = new Wife("xiaohong");
    //构造器私有化
    private Wife(String name) {
        this.name = name;
    }

    //这里使用static:这个类不能创建对象,无法调用对象方法,只能调用static方法
    //这个方法不是静态的,就必须new一个对象,访问非静态方法
    public static Wife getInstance() {
        return wf;
    }

    @Override
    public String toString() {
        return "Wife{" +
                "name='" + name + '\'' +
                '}';
    }
}

在这里插入图片描述
饿汉式,有可能没使用这个实例,就创建好了。private static Wife wf = new Wife(“xiaohong”); 是静态变量,在类加载的时候就已经创建好了。这种对象通常是重量级的对象。可能造成创建了对象但是没有使用,所以会使资源浪费。

懒汉式,使用这个实例的时候再创建。

2、懒汉式

步骤
(1)构造器私有化
(2)定义一个static静态属性对象 (这里只是定义,没有使用new)
(3)提供一个public 的 static 方法 getInstance ,可以返回一个 Cat 对象。在此方法中才 new
(4)懒汉式:只有当用户使用 getInstance 时,才返回 cat 对象。后面再次调用时,会返回上次创建的对象。

//程序运行过程中,只能养一只猫
class Cat {
    private String name;
    private static Cat cat;

    private Cat(String name) {
        this.name = name;
    }

    public static Cat getInstance() {
        if(cat == null) {
            cat = new Cat("kitty");
        }
        return cat;
    }

}

3、区别

  1. 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善)
  3. 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
  4. 在我们 javaSE标准类中,java.lang.Runtime 就是经典的单例模式。
    (Runtime 源码,饿汉式)
    在这里插入图片描述

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03


http://www.kler.cn/a/147171.html

相关文章:

  • python核心语法
  • 3步实现贪吃蛇
  • JAVA-链表
  • 【Android】EventBus事件总线用法浅析
  • http响应码https的区别
  • VuePress v2 快速搭建属于自己的个人博客网站
  • 华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署
  • redis—— 渐进式遍历
  • Java[list/set]通用遍历方法之Iterator
  • C++之算术生成算法
  • 分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题
  • TDA4VM EVM开发板调试笔记
  • 移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS
  • c# statusStrip 显示电脑主机名、IP地址、MAC地址
  • vue day2
  • 【深度学习】如何找到最优学习率
  • Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)
  • 数据结构 / 结构体指针
  • [每周一更]-(第74期):Docker-compose 部署Jenkins容器-英文版及错误纠错
  • taro h5 ios解决input不能自动获取焦点拉起键盘
  • YOLOv5轻量化改进之mobilenetv3,更换mobilenetv3中的注意力机制。
  • Windows 下安装MySQL8.0 Zip
  • 057-第三代软件开发-文件监视器
  • 2023信息技术应用创新论坛|云轴科技ZStack分享云原生超融合在智慧交通的应用
  • IDEA 2022.1 同一个 spring boot main类运行多个实例
  • 基于helm的方式在k8s集群中部署gitlab - 部署(一)