首页 > 其他分享 >单例模式(Singleton Pattern)

单例模式(Singleton Pattern)

时间:2023-05-09 14:01:17浏览次数:37  
标签:Singleton Pattern LazySingleton 模式 instance 实例 单例

单例模式

模式动机

单例模式(Singleton Pattern)是结构最简单的设计模式,它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以确保系统中一个类只有一个实例,且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。


  1. 定义一个全局变量可以确保对象随时都可以被访问,但是不能防止实例化多个对象。(代码实现)
  2. 更好的办法是让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,并且提供一个访问该实例的方法。(机制实现)

模式定义

  • 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
  • 单例模式的要点有三个:
    • 某个类只能有一个实例
    • 必须自行创建这个实例
    • 必须自行向整个系统提供这个实例
  • 单例模式是一种对象创建型模式

模式结构

image

模式分析


  • 私有构造函数
  • 静态私有成员变量(自身类型)
  • 静态公有的工厂方法

单例类:

public class Singleton {
    //静态私有成员变量
    private static Singleton instance=null;
        //私有构造函数
    private Singleton() {
    }
       //静态公有工厂方法,返回唯一实例
    public static Singleton getInstance() {
        if(instance==null)
            instance=new Singleton();
        return instance;
    }
}

  • 单例模式的目的

    • 保证一个类只有一个唯一的实例,并为它提供一个全局访问点。
  • 实现单例模式的思想

    • 为了防止客户端程序使用构造函数来创建多个对象,可以将构造函数声明为私有的,这样客户端程序就不可以使用它来创建任何对象。
  • 单例模式的问题

    • 如果声明构造函数为私有类型,那么没有客户端程序可以使用它来创建任何对象,因此它对客户端程序是无用的。
  • 单例模式优点

    • 提供了对唯一实例的受控访问
    • 可以节约系统资源,提高系统的性能
    • 允许可变数目的实例(多例类)
  • 单例模式缺点

    • 扩展困难(缺少抽象层)
    • 单例类的职责过重。单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中
    • 由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失
  • 在以下情况下可以使用单例模式

    • 系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象
    • 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

单例模式分类

饿汉式(Eager Singleton):顾名思义,该模式在类被加载时就会实例化一个对象。

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton(); 
    private EagerSingleton() { }
    public static EagerSingleton getInstance() {
        return instance;
    }
}

懒汉式(Lazy Singlenton):该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)

public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }

public static LazySingleton getInstance() {
	if (instance == null) {
		instance = new LazySingleton();
    }
	return instance;
}
}

关于Synchronized 类型的方法
  • Synchronized类型的方法限制每个执行此方法的线程必须在执行下一个线程之前完全执行;
  • 通过这种方式,创建的对象在多个线程的情况下是唯一的;
  • 也就是说,我们已经给Synchronized类型的对象添加了锁。当一个线程执行此方法时,其他方法无法接管。其他线程应该等待.
  • 只有在当前线程执行完该方法后,另一个线程才能开始执行该方法
锁方法:
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
synchronized public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
        }
return instance;
}
}
锁代码段
public static LazySingleton getInstance() { 
    if (instance == null) {
        synchronized (LazySingleton.class) {
            instance = new LazySingleton();
        }
    }
    return instance;
}

懒汉式与饿汉式比较

懒汉式 饿汉式
实例化 外部调用时 类加载时
线程安全 不安全 安全
执行效率 较低 较高
内存 不浪费 浪费

标签:Singleton,Pattern,LazySingleton,模式,instance,实例,单例
From: https://www.cnblogs.com/sorrymine/p/17384211.html

相关文章

  • 2023.5.8 单例设计模式
     单例设计模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接......
  • 单例模式-C#
    //Seehttps://aka.ms/new-console-templateformoreinformation//Console.WriteLine("Hello,World!");classSingleCase{publicstaticSingleCaseinstance=null;publicstringname="";publicstaticSingleCasegetInstance(string......
  • [Typescript] Builder pattern 07- Reducer
    import{Expect,Equal}from"../types/utils"import{expect,it}from'vitest';typePayloadsToDiscriminatedUnion<TextendsRecord<string,any>>={[KinkeyofT]:{type:K}&T[K];}[keyofT];exportclas......
  • cpp: Strategy Pattern II
     //Gold.h:此文件包含"Gold"类。策略模式StrategyPatternC++14//2023年5月1日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce//#ifndefGOLD_H//#defineGOLD_H#ifndef_GOLD_#define_GOLD_#include<iostream>#include<sstrea......
  • SmartInitializingSingleton 特殊的Spring接口
    SmartInitializingSingleton接口是ApplicationContext对BeanFactory的增强功能。文章目录什么是SmartInitializingSingleton接口在什么时候起作用有什么用途什么是SmartInitializingSingleton接口SmartInitializingSingleton接口是ApplicationContext对BeanFactory的增强功能可......
  • cpp: Prototype Pattern
     //Gold.h:此文件包含"Gold"类。原型模式PrototypePatternC++14//2023年5月1日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLD_H#defineGOLD_H#include<iostream>usingnamespacestd;namespaceDuJewelryPrototyp......
  • cpp: Abstract Factory Pattern
     //Gold.h:此文件包含"Gold"类。AbstractFactoryPatternC++14//2023年4月30日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLD_H#defineGOLD_H#include<iostream>usingnamespacestd;namespaceDuJewelryAbstra......
  • cpp: Simple Factory Pattern
     //Monster.h:此文件包含"Monster"类。AbstractFactoryPatternC++14//2023年4月29日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefMONSTER_H#defineMONSTER_H#include<iostream>usingnamespacestd;namespaceDuAbstr......
  • 六:单例模式:独一无二的存在
    a.揭开单例模式的神秘面纱在软件的世界里,我们常常会遇到这样一类对象:它们如同世界上独一无二的宝藏,只存在一个实例。这类对象成为了众多开发者追捧的焦点。为了满足这一特殊需求,设计模式大师们发明了一种叫做“单例模式”的设计。它犹如一种魔法,让某个类的实例永远只有一个。如今......
  • cpp: Template Mothod Pattern
    文章来源《C++新经典设计模式》王健伟编著 清华大学出版社 //TemplateMethonPattern.h:此文件包含"TemplateMethonPattern"类。TemplateMothodPatternC++14//2023年4月29日涂聚文GeovinDuedit.#define_UNICODE#pragmaonce#ifndefTEMPLATEMOTHOD_H......