java设计模式之单例设计模式的妙用

简介: 1.设计模式设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美地解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因


1.设计模式


设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美地解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因


2.单例设计模式


单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:


系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能

可以严格控制客户怎么样以及何时访问单例对象。

单例模式的写法有好几种,主要有三种:懒汉式单例、饿汉式单例、登记式单例


3.饿汉式


使用饿汉式的步骤:


构造器私有化(防止直接进行new)

类的内部创建对象

向外暴漏一个获取实例的静态的公共方法,getInstance

实例:


/**
 * 饿汉式设计模式
 */
public class HungryMan {
    public static void main(String[] args) {
        // 饿汉式只能存在一个对象实例!
        GirlFriend gf = GirlFriend.getInstance();
        System.out.println(gf);
    }
}
class GirlFriend {
    private String name;
    // 在类的内部创建一个对象
    private static GirlFriend gf = new GirlFriend("Miss.qian");
    // 提供一个公共的static方法,返回gf对象
    public static GirlFriend getInstance() {
        return gf;
    }
    // 构造器私有化
    private GirlFriend(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}


4.懒汉式


使用饿汉式可能造成创建了对象但是没有使用的情况,造成了资源的浪费,于是就有了懒汉式


使用懒汉式的步骤:


构造器私有化(防止直接new)

定义一个static属性对象

提供一个公共的public的static方法getInstance,可以创建并返回一个Cat对象

实例:


/**
 * 设计模式 - 懒汉式
 */
public class LazyMan {
    public static void main(String[] args) {
        Cat cat = Cat.getInstance();
        System.out.println(cat);
        Cat cat2 = Cat.getInstance();
        System.out.println(cat2);
    }
}
class Cat {
    private String name;
    // 定义一个static属性对象
    private static Cat cat;
    // 提供一个公共的public的static方法,可以创建并返回一个Cat对象
    public static Cat getInstance() {
        if (cat == null) {
            System.out.println("创建了一只猫");
            cat = new Cat("喵喵~");
        }
        return cat;
    }
    // 构造器私有化
    private Cat(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}
--------------------------------
输出:
创建了一只猫
Cat{name='喵喵~'}
Cat{name='喵喵~'}


懒汉式只有当用户执行getInstance方法时才会创建对象,并且保证对象单一,实现单例🥯


饿汉式不存在线程安全的问题,懒汉式存在线程安全的问题👴🏻


风吹瓦堕屋,正打破我头。

瓦亦自破碎,岂但我血流。

目录
相关文章
|
13天前
|
设计模式 缓存 安全
「全网最细 + 实战源码案例」设计模式——单例设计模式
单例模式是一种创建型设计模式,确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。它常用于控制共享资源的访问,如数据库连接、配置管理等。实现方式包括饿汉式(类加载时初始化)、懒汉式(延迟加载)、双重检查锁、静态内部类和枚举单例等。其中,枚举单例最简单且安全,能有效防止反射和序列化破坏。
28 7
|
3月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
3月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
52 2
|
3月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
51 4
|
4月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
87 0
[Java]23种设计模式
|
3月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
4月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
5月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
5月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
5月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)