我用C语言玩对象,独一无二的单例模式

  • Post author:
  • Post category:其他



概念

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。


注意

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。


介绍

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

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。


核心



在类构造函数中声明静态指针变量并初始化为NULL,当创建后,该变量指向创建地址,根据该变量判断该类是否创建过,若无,则创建,否则,返回该变量即可



示例

★包含头文件single.h和源文件single.c(均已验证通过)。


single.h

 * @Filename : single.h
 * @Revision : $Revision: 1.0 $
 * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
 * @Description : 单例模式应用(C语言模拟C++)
 * @Explain : 单例模式,只允许创建一个对象
**/
#ifndef __SINGLE_H__
#define __SINGLE_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


/* 类操作, 带参数 */
#define CLASS_CALL(THIS,func,args...) ((THIS)->func(THIS,args))

/* 类操作, 无参数 */
#define CLASS_CALL_0(THIS,func) ((THIS)->func(THIS))


/* 单例类定义 */
struct single {
    char name[16];          /* 类名 */

    void (*show)(struct single *p_single);
};

/* 创建Single对象 */
struct single *new_single(char *name);

#endif


single.c

/**
 * @Filename : single.c
 * @Revision : $Revision: 1.0 $
 * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
 * @Description : 单例模式应用(C语言模拟C++)
 * @Explain : 单例模式,只允许创建一个对象
**/
#include "single.h"

/**
 * @输出类名
 * @p_single:single类         
**/
static void _show(struct single *p_single)
{
    printf("the class name is :%s\n", p_single->name);
}

/**
 * @创建single对象
 * @name:类名
 * @成功返回类对象,失败返回NULL                         
**/
struct single *new_single(char *name)
{
    static struct single *p_single = NULL;

    if (p_single != NULL) {
        printf("The singleton object already exists...\n");
        return p_single;
    }

    if ((p_single = (struct single *)malloc(sizeof(struct single))) == NULL)
        return NULL;

    memset((char *)p_single, 0, sizeof(struct single));

    strcpy(p_single->name, name);
    p_single->show = _show;

    printf("The singleton object was created successfully...\n");
    return p_single;
}

/**
 * @主函数,演示代码                      
**/
int main(void)
{ 
    struct single *p_single = new_single("feng");
    struct single *p_single1 = new_single("seven");

    /* seven在feng创建之后,所以seven创建失败,将会得到的是feng对象 */
    CLASS_CALL_0(p_single, show);
    CLASS_CALL_0(p_single1, show);

    return 0;
}


结论

feng:single$ gcc -o single single.c
feng:single$ ./single
The singleton object was created successfully...
The singleton object already exists...
the class name is :feng
the class name is :feng
feng:single$ 

示例代码通过new_single()创建两个单例对象p_single和p_single1,然后输出单例对象名字,实际上情况是,只有p_single对象创建并实例化成功,p_single1创建后同样指向p_single,体现了单例模式的基本特性,即:


一个类有且仅有一个实例



往期 · 推荐


也没想象中那么神秘的数据结构-先来后到的“队列”(链式队列)


也没想象中那么神秘的数据结构-先来后到的“队列”(循环队列)


也没想象中那么神秘的数据结构-后来居上的“栈”


我用C语言玩对象,观察者模式应用2-热水的用途


我用C语言玩对象,状态模式应用1-水的三态


关注

更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外


你若想要本文章源码请关注公众号:不只会拍照的程序猿,后台回复:设计模式源码,也可


点击此处下载






版权声明:本文为rt201314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。