> 技术文档 > Java中的设计模式:单例模式与工厂模式深度解析!_java 单例 文件夹

Java中的设计模式:单例模式与工厂模式深度解析!_java 单例 文件夹


全文目录:

    • 开篇语
    • 前言
    • 一、单例模式(Singleton Pattern)
      • 1.1 单例模式概述
      • 1.2 单例模式的实现方式
        • 1.2.1 饿汉式(Eager Initialization)
        • 1.2.2 懒汉式(Lazy Initialization)
        • 1.2.3 双重检查锁定(Double-Checked Locking)
      • 1.3 单例模式的应用场景
    • 二、工厂模式(Factory Pattern)
      • 2.1 工厂模式概述
      • 2.2 工厂模式的类型
        • 2.2.1 简单工厂模式(Simple Factory Pattern)
        • 2.2.2 工厂方法模式(Factory Method Pattern)
      • 2.3 工厂模式的应用场景
    • 三、总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在软件开发中,设计模式是非常重要的工具,它帮助我们更有效地解决开发过程中常见的难题。尤其是在大规模的软件工程中,设计模式帮助开发者构建出高质量、易维护、易扩展的系统。今天,我们将重点分析两种经典的设计模式:单例模式工厂模式。这两种模式在实际开发中极为常见,且有着各自独特的应用场景和优势。

  你可能会问:为什么我要关注设计模式?简单来说,设计模式不仅仅是代码的写法,它们还帮助开发者进行思维框架的构建。学习并熟练掌握设计模式,让你在面对复杂系统时更加从容,代码更加优雅。

  今天的文章将通过详细的解析和丰富的代码示例,帮助你深入理解单例模式工厂模式的实现与应用场景。让我们一步步剖析这两个设计模式,为你的编程之路提供有力的支持。


一、单例模式(Singleton Pattern)

1.1 单例模式概述

  单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并且提供一个全局访问点来访问该实例。这种模式常常用于那些需要全局共享资源的场景,比如配置文件读取、数据库连接池等。

  单例模式的关键点:

  • 唯一性:保证类在应用程序中只有一个实例。
  • 全局访问点:可以通过一个全局点访问该唯一实例。
  • 延迟初始化:确保类的实例在需要时才创建,而不是在应用启动时就创建。

单例模式的使用场景很多,比如数据库连接池、线程池、日志管理器等,它能确保只有一个实例存在,避免资源浪费和冲突。

1.2 单例模式的实现方式

在 Java 中,单例模式有多种实现方式,主要包括:饿汉式懒汉式双重检查锁定等。

1.2.1 饿汉式(Eager Initialization)

  在饿汉式单例模式中,类的实例在类加载时就被创建,即使这个实例在程序运行中不一定会用到。它的最大优点是简单且线程安全,但如果实例创建较为复杂,且在程序中未必使用,这种方式会导致不必要的资源浪费。

public class Singleton { // 在类加载时创建实例 private static final Singleton instance = new Singleton(); // 私有构造函数,防止外部实例化 private Singleton() {} // 提供全局访问点 public static Singleton getInstance() { return instance; }}

  优点:代码简单,且线程安全。
  缺点:不管是否需要实例,类加载时就会创建对象,浪费内存。

1.2.2 懒汉式(Lazy Initialization)

  懒汉式单例模式通过延迟加载(只有在需要实例时才创建)来节省内存。通常使用 synchronized 来保证线程安全,但是每次获取实例时都要加锁,可能会影响性能。

public class Singleton { private static Singleton instance; // 私有构造函数 private Singleton() {} // 提供全局访问点 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}

  优点:节省内存,只有在需要时才创建实例。
  缺点:每次访问都需要加锁,导致性能损失,尤其是在多线程环境下。

1.2.3 双重检查锁定(Double-Checked Locking)

  为了在保证延迟加载的同时提升性能,双重检查锁定通过在第一次判断时不加锁,第二次判断时加锁,来减少加锁的开销。配合 volatile 关键字来确保线程安全。

public class Singleton { private static volatile Singleton instance; // 私有构造函数 private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) {  instance = new Singleton(); } } } return instance; }}

  优点:高效且线程安全。
  缺点:实现相对复杂,理解 volatile 的使用。

1.3 单例模式的应用场景

  • 日志管理:应用中通常只需要一个日志对象来管理日志文件,使用单例模式避免多次创建实例。
  • 数据库连接池:通过单例模式来管理数据库连接池,避免每次访问数据库时都要重新创建连接对象。
  • 缓存管理:确保缓存数据只有一个实例,避免内存中的缓存数据不一致。

二、工厂模式(Factory Pattern)

2.1 工厂模式概述

  工厂模式(Factory Pattern)属于创建型设计模式,它提供了一个创建对象的接口,而让子类决定实例化哪一个类。工厂模式将对象的创建过程封装在工厂类中,客户端通过工厂来获取所需的对象,而不需要知道具体的创建过程和实现类。工厂模式的好处在于它将类的实例化过程与业务逻辑解耦,提高了系统的灵活性和可维护性。

2.2 工厂模式的类型

工厂模式主要有三种形式:简单工厂模式工厂方法模式抽象工厂模式

2.2.1 简单工厂模式(Simple Factory Pattern)

  简单工厂模式是工厂模式中最基本的形式,工厂类通过一个方法根据传入的参数创建不同的产品对象。这种方式适合产品类较少的情况,但当产品种类多了之后,工厂类会变得臃肿,难以维护。

// 产品接口interface Product { void doSomething();}// 具体产品类class ProductA implements Product { public void doSomething() { System.out.println(\"ProductA is doing something.\"); }}class ProductB implements Product { public void doSomething() { System.out.println(\"ProductB is doing something.\"); }}// 工厂类class ProductFactory { public static Product createProduct(String type) { if (\"A\".equals(type)) { return new ProductA(); } else if (\"B\".equals(type)) { return new ProductB(); } return null; }}

  优点:客户端通过工厂方法创建对象,简化了对象的创建过程。
  缺点:当产品类增多时,工厂类会变得庞大,导致维护困难。

2.2.2 工厂方法模式(Factory Method Pattern)

  工厂方法模式通过为每个具体产品类定义一个工厂类,客户端通过工厂方法来获取产品对象。它避免了简单工厂模式中的单一工厂类变得过于庞大,增加了系统的灵活性。

// 产品接口interface Product { void doSomething();}// 具体产品类class ProductA implements Product { public void doSomething() { System.out.println(\"ProductA is doing something.\"); }}class ProductB implements Product { public void doSomething() { System.out.println(\"ProductB is doing something.\"); }}// 工厂接口interface Factory { Product createProduct();}// 具体工厂类class FactoryA implements Factory { public Product createProduct() { return new ProductA(); }}class FactoryB implements Factory { public Product createProduct() { return new ProductB(); }}

  优点:扩展性好,新的产品只需要新增工厂类即可。
  缺点:工厂类的数量会随着产品种类的增加而增加,代码量增多。

2.3 工厂模式的应用场景

  • 图形界面组件:创建不同风格的UI组件,如按钮、文本框等。
  • 数据库连接:根据数据库类型(MySQL、Oracle等)创建相应的连接对象。
  • 日志记录:创建不同格式的日志记录类(文件、数据库等)。

三、总结

  在今天的分享中,我们深入解析了单例模式工厂模式,并通过具体的代码示例帮助你理解它们的实现与应用。通过合理使用这些设计模式,可以有效地提高代码的可维护性和可扩展性,同时也能帮助你在实际开发中避免冗余和复杂的代码结构。

  无论是单例模式保证系统的全局唯一性,还是工厂模式实现对象的灵活创建,这两种设计模式在大型系统开发中都发挥着重要的作用。掌握并灵活运用这些设计模式,你将能够编写出更加优雅、高效的代码。

  希望通过今天的解析,你能更加深入地理解这两个设计模式,并在今后的开发中得心应手地应用它们!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!