设计模式:单例模式

今天来简单来说一下单例模式:它要确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

比如我们登录一个系统的时候要记录一个员工的信息,在整个系统运行过程中可能要不段的访问这个员工的信息,

一般情况下我们会有两种做法,第一种建一个静态类,第二种就是今天我要说的键一个单例类

今天只说单例类,建单例类要有几个要求

1.私有的构造方法

2.指向自己实例的私有静态引用

3.以自己为实例为返回值的静态方法

单例模式实例化对象有两种方式

1.懒汉模式:调用取得实例方法的时候才去实例化对象

  public class singleClassDemo
    {
        private static singleClassDemo singleC;

        private singleClassDemo()
        {
        }

        private static singleClassDemo InitSingle()
        {
            if (singleC == null)
                singleC = new singleClassDemo();

            return singleC;
        }
    }

2.饿汉模式:单例类被加载时候实例化对象

    public class singleClassDemo
    {
        private static singleClassDemo singleC = new singleClassDemo();

        private singleClassDemo()
        {
        }

        private static singleClassDemo InitSingle()
        {
            return singleC;
        }    
    }

 做一个小例子:保存员工的名字和ID

public class Program
    {
        static void Main(string[] args)
        {
            singleClass s1 = singleClass.getSingleClass();
            singleClass s2 = singleClass.getSingleClass();   //已经实例化过一次了不会再实例化了        
            

            Console.ReadLine();
        }
    }
    public class singleClass
    {
        private static singleClass singleC = new singleClass();
        private singleClass()// 在整个程序运行过程中只实例化一次
        {
            id = "001";
            name = "ERP";
            Console.WriteLine("singleClass run");
        }
        public static singleClass getSingleClass()
        {            
            return singleC;
        }

        private static string id;
        public static string ID
        {
            get
            {
                return id;
            }
        }

        private static string name;
        public static string Name
        {
            get
            {
                return name;
            }
        }
    }

c++代码

#pragma once
#include<iostream>

class SingleClassDemo
{
public:
    static SingleClassDemo * initSingleClass();
    std::string getName();
private:
    explicit SingleClassDemo();
    static SingleClassDemo * singleClass;
    std::string m_name;
};

#include "stdafx.h"
#include "singleClassDemo.h"
#include <string>

SingleClassDemo * SingleClassDemo::singleClass = nullptr;

SingleClassDemo * SingleClassDemo::initSingleClass()
{
    if (singleClass == nullptr) {
        singleClass = new SingleClassDemo();
    }
    return singleClass;
}

std::string SingleClassDemo::getName()
{
    if (m_name.empty()) {
        m_name = "boke";
    }
    return m_name;
}

SingleClassDemo::SingleClassDemo()
{
}

//main

    SingleClassDemo  * s = SingleClassDemo::initSingleClass();
    std::cout << s->getName();

    std::cin.get();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

file类之目录

     可以解决的问题是:                 有时需要列出目录下指定类型的文件,比如java,txt等扩展名的文件,可以使用File类的下述两个...

2995
来自专栏Java架构沉思录

聊聊设计模式之模板方法模式

导语 模板方法模式是指在父类中定义好算法的骨架,而把具体的算法步骤交给子类去实现的一种设计模式。模板方式模式可以在不改变算法整体骨架的情况下,对算法的某些步骤...

36411
来自专栏IT笔记

Python3中文字符编码问题

最近在尝试 Python Web方面的开发尝试,框架使用的是Django,但是在读取数据库并页面展示的时候,出现了中文编码的问题。

3343
来自专栏王亚昌的专栏

类静态指针的申请和释放

     如果类有一个静态成员指针变量,在进程中执行new或malloc操作分配了内存,进程退出前并不需要调用new或malloc,因为系统会自动进行释放。但这...

1042
来自专栏任浩强的运维生涯

mongodb高级应用

一、  高级查询 查询操作符 条件操作符:db.collection.find({“field”:{$gt/$lt/$gte/$lte/$eq/$ne:valu...

36310
来自专栏coding

Linux文本处理命令

1122
来自专栏技巅

GlusterFS之内存池(mem-pool)实现原理及代码详解

1355
来自专栏数据结构与算法

BZOJ5312: 冒险(势能均摊线段树)

结论:如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的

942
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(一)

【原文地址】https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档...

3359
来自专栏cs

研究生的一份试题的几道题节选

首先祝朋友考研成功,勇往直前,我是不考研的,所以完全以提高能力,使用为主,不在意细节。小伙伴让我帮忙看了一下试卷,故截取了几道题目。 c我是真的应了那句话,从入...

3478

扫码关注云+社区