设计模式(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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚