设计模式之单例模式20170711

创建型设计模式之单例模式

一、含义

在一个进程或者线程里,对于一个类只有一个实例化对象,即内存中只有一个实例化对象

二、代码说明

由于是单例模式,只有一个对象,所以该类内部都是静态常量和静态方法,

具体来说,因为只有一个对象不能创建多个对象,创建对象就没什么意义了(直接用类表示对象即一个类就是一个对象),所以类内部都是静态的,不需创建就可使用(而且由于是静态的也确保每次调用都是属于类的内存空间,即只占一份内存空间也就是一个对象的内存空间)

在用C实现过程中也是参考这种思想,直接构造一个类的对象,而且不提供new这个类的对象的接口,具体实现如下:

单例模式使用场景:

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     SingletonPattenUsage.c
 5 * Description        :     单例模式的使用
 6
 7 [email protected]:/work/projects/test/DesignPatterns$ gcc -o SingletonPatternUsage SingletonPattern.c SingletonPatternUsage.c
 8 [email protected]:/work/projects/test/DesignPatterns$ ./SingletonPatternUsage
 9 This is:Singleton
10 SingletonGetId:12
11
12 * Created            :     2017.07.02.
13 * Author            :     Yu Weifeng
14 * Function List         :
15 * Last Modified     :
16 * History            :
17 ******************************************************************************/
18 #include"stdio.h"
19 #include"malloc.h"
20 #include"stdlib.h"
21 #include"string.h"
22 #include"SingletonPattern.h"
23
24
25
26
27 /*****************************************************************************
28 -Fuction        : main
29 -Description    :
30 -Input            :
31 -Output         :
32 -Return         :
33 * Modify Date      Version         Author           Modification
34 * -----------------------------------------------
35 * 2017/06/29      V1.0.0         Yu Weifeng       Created
36 ******************************************************************************/
37 int main(int argc,char **argv)
38 {
39     g_tSingleton.PrintInfo();
40     g_tSingleton.SetId(12);
41     printf("SingletonGetId:%d\r\n",g_tSingleton.GetId());
42
43     return 0;
44 }

SingletonPattenUsage.c

被调用者:

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     SingletonPattern.c
 5 * Description        :     单例模式
 6 * Created            :     2017.07.02.
 7 * Author            :     Yu Weifeng
 8 * Function List         :
 9 * Last Modified     :
10 * History            :
11 ******************************************************************************/
12 #include"stdio.h"
13 #include"malloc.h"
14 #include"stdlib.h"
15 #include"string.h"
16 #include"SingletonPattern.h"
17
18 static void PrintInfo();
19 static void SetId(int i_iId);
20 static int GetId();
21
22
23 static char *g_strSingleton="Singleton";//私有变量
24 static int g_iId=0;//私有变量
25
26
27
28 //懒汉模式用到的时候才初始化,线程不安全(要加锁解决)
29 //一般使用饿汉模式,非常饿,迫不及待也就是一开始就做了(初始化了)
30 const T_Singleton g_tSingleton={
31     .PrintInfo    =PrintInfo,
32     .SetId    =SetId,
33     .GetId    =GetId,
34 };
35
36
37 /*****************************************************************************
38 -Fuction        : PrintInfo
39 -Description    : 公有函数(单例模式所以才加了static)
40 -Input            :
41 -Output         :
42 -Return         :
43 * Modify Date      Version         Author           Modification
44 * -----------------------------------------------
45 * 2017/06/29      V1.0.0         Yu Weifeng       Created
46 ******************************************************************************/
47 static void PrintInfo()
48 {
49     printf("This is:%s\r\n",g_strSingleton);
50 }
51
52 /*****************************************************************************
53 -Fuction        : SetId
54 -Description    : 公有函数(单例模式所以才加了static)
55 -Input            :
56 -Output         :
57 -Return         :
58 * Modify Date      Version         Author           Modification
59 * -----------------------------------------------
60 * 2017/06/29      V1.0.0         Yu Weifeng       Created
61 ******************************************************************************/
62 static void SetId(int i_iId)
63 {
64     g_iId=i_iId;
65 }
66
67 /*****************************************************************************
68 -Fuction        : GetId
69 -Description    : 公有函数(单例模式所以才加了static)
70 -Input            :
71 -Output         :
72 -Return         :
73 * Modify Date      Version         Author           Modification
74 * -----------------------------------------------
75 * 2017/06/29      V1.0.0         Yu Weifeng       Created
76 ******************************************************************************/
77 static int GetId()
78 {
79     return g_iId;
80 }

SingletonPattern.c

 1 /*****************************************************************************
 2 * Copyright (C) 2017-2018 Hanson Yu  All rights reserved.
 3 ------------------------------------------------------------------------------
 4 * File Module        :     SingletonPattern.h
 5 * Description        :     单例模式
 6 * Created            :     2017.07.02.
 7 * Author            :     Yu Weifeng
 8 * Function List         :
 9 * Last Modified     :
10 * History            :
11 ******************************************************************************/
12 #ifndef SINGLETON_PATTERN_H
13 #define SINGLETON_PATTERN_H
14
15
16 typedef struct Singleton
17 {
18     void (*PrintInfo)();
19     void (*SetId)(int i_iId);
20     int (*GetId)();
21 }T_Singleton;
22
23
24 extern const T_Singleton g_tSingleton;
25
26
27
28 #endif

SingletonPattern.h

详细代码:

https://github.com/fengweiyu/DesignThinking/tree/master/DesignPatterns/CreationalDesignPatterns/SingletonPattern

执行结果:

[email protected]:/work/projects/test/DesignPatterns$ gcc -o SingletonPatternUsage SingletonPattern.c SingletonPatternUsage.c

[email protected]:/work/projects/test/DesignPatterns$ ./SingletonPatternUsage

This is:Singleton

SingletonGetId:12

三、使用场景

1.整个项目中需要一个共享访问点或共享数据

2.需要定义大量静态常量和静态方法的环境(当然也可以直接声明为static的方式)

3.创建一个对象需要消耗的资源过多

4.要求生成唯一序列号的环境

四、优点

1.减少内存开支,减少了系统的性能开销

2.避免对资源的多重占用

3.可以在系统设置全局的访问点,优化和共享资源访问

五、缺点

1.与单一职责原则冲突,一个类应该只实现一个逻辑,而不关心它是否是单例的,单例模式把"要单例"和业务逻辑融合在一个类中

2.一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径

创建型设计模式包括,单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,由于封装性,C的对象都是函数的对象,并且创建多个对象比较耗内存,出于紧急性和重要性考虑,因此除了单例模式,其余模式放在行为型设计模式和结构型设计模式后再讨论

时间: 2024-12-13 10:58:57

设计模式之单例模式20170711的相关文章

Java设计模式:单例模式

概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

设计模式 之 单例模式

单例模式思路: 私有化构造方法: 防止实例化 私有化克隆方法: 防止克隆 私有化静态属性: 保存对象 公有化静态方法: 获取对象 代码: <?php //设计模式:单例模式 class Singleton { //私有化静态属性:用于保存对象 private static $obj; //私有化构造方法 private function __construct(){} //公有化静态方法:用于实例化对象 public static function getObj() { //判断对象是否存在 i

设计模式实例学习-单例模式(Android中的使用场景)

1.设计模式实例-单例模式 单例模式,故名思议,是指在一个类中通过设置静态使得其仅创造一个唯一的实例.这样设置的目的是满足开发者的希望--这个类只需要被实例化创建一次,同时因为其为静态的缘故,加载的速度也应该快于正常实例化一个类的速度(理论上). 在Android开发中,当我们需要创建一个Fragment的时候常常会用到这样的模式,没有代码的学习是虚无的,接下来亮代码学习: public class SelectFrame extends Fragment { private final sta

(九)JAVA设计模式之单例模式

JAVA设计模式之单例模式 一.单例模式的介绍 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.     全局对象和Singleton模式有本质的区别,因为大量使用全局对象会使得程序质量降低,而且有些编程语言根本不支持全局变量.最重要的是传统的全局对象并不能阻止一个类被实例化多次. 二.单例模式的特点 单例类只能有一个实例 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例.

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只

.NET设计模式之(单例模式)

1.单例模式,一个类只能new一个对象 2.举例,资源管理器,文件管理器,地球等: 3.创建单例: (1)创建一个Earth类 class Earth { public Earth() { } } (2)将构造函数 私有化 class Earth { private Earth() { } } (3)声明一个静态私有的字段,初始化一个实例 class Earth { private static Earth instance=new Earth(); private Earth() { } }

Java 设计模式(3)单例模式

前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,

设计模式【单例模式】

Java中单例模式是一种常见的设计模式,单例模式分为:饿汉式单例模式.懒汉式单例模式.登记式单例模式.枚举式单例模式.作为对象的常见模式的单例模式,确保某一类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 举例说明:在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实