设计模式(1)-对象创建型模式-Singleton模式

2024-04-20 00:08

本文主要是介绍设计模式(1)-对象创建型模式-Singleton模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.对象创建型模式

1.1            SINGLETON模式

 

Singleton 模式是最为简单、最为常见、最容易实现的设计模式。公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是Singleton模式。

1.1.1 意图

意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.1.2 动机(需求)

动机: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。比如只应该有一个文件系统和一个窗口管理器。

1.1.3 结构


1.1.4 C++实现

 

//Singleton.h

#ifndef _SINGLETON_H_

#define _SINGLETON_H_

#include<iostream>

using namespace std;

 

class Singleton

{

public:

       static Singleton *Instance();

protected:

       Singleton();

private:

       static Singleton *_instance;

};

#endif //~_SINGLETON_H_

 

//Singleton.cpp

#include"Singleton.h"

#include<iostream>

using namespace std;

 

Singleton*Singleton::_instance = 0;

Singleton::Singleton()

{

       cout << "Singleton...."<< endl;

}

 

Singleton*Singleton::Instance()

{

       if (_instance == 0)

       {

              _instance = new Singleton();

       }

       return _instance;

}

 

#include"Singleton.h"

#include<iostream>

using namespace std;

 

int main(int argc, char*argv[])

{

       Singleton *sgn = Singleton::Instance();

       return 0;

}

 

客户仅通过I n s t a n c e 成员函数访问这个单件。变量_ i n s t a n c e初始化为0,而静态成员函数In s t a n c e 返回该变量值,如果其值为0则用唯一实例初始化它。I n s t a n c e使用惰性(l a z y)初始化;它的返回值直到被第一次访问时才创建和保存。

注意构造器是保护型的。试图直接实例化S i n g l e t o n的客户将得到一个编译时的错误信息。这就保证了仅有一个实例可以被创建。

1.1.5 Java实现

 

一个经典的单例实现:
public class Singleton{
      
private static Singleton uniqueInstance = null;
      private Singleton(){
          // Exists only todefeat instantiation.
     
}

   public static SingletongetInstance() {
             
if (uniqueInstance == null) {
                      
uniqueInstance = new Singleton();

      }

       return uniqueInstance;

   }

    // Othermethods...

}

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

Singleton模式经常和Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象一般来说只要一个.

这篇关于设计模式(1)-对象创建型模式-Singleton模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918813

相关文章

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定