设计模式
2015-10-24 22:34
393 查看
设计模式
单例模式
单例模式要求两点:保证类有且只有一个实例
提供一个访问的全局访问点
懒汉模式
懒汉模式特点:延迟创建实例对象。class Singleton { private: //私有(或者protected)构造函数,防止类外创建对象 Singleton(); //static方法只能调用static数据成员,且该处只是声明instance,需要在类外定义(即初始化) static Singleton *instance; //严谨来看,复制构造函数和=操作符也要设置为私有 Singleton(const Singleton&); Singleton& operator=(const Singleton&); public: //全局访问方法,定义为static因为通过类名调用只能是static方法 //非static方法不能通过类名调用 static Singleton *get_instance(); }; //static数据成员,需要在类外定义(定义才会分配空间) Singleton* Singleton::instance = 0; Singleton::Singleton() { cout << "code" << endl; } Singleton* Singleton::get_instance() { if (instance == 0) //因私有构造函数,所以需要亲自创建对象 instance = new Singleton(); return instance; } int main(void) { Singleton *single = Singleton::get_instance(); return 0; }
存在问题:单线程安全,当是多线程则会创建多个实例,因为多个线程判断instance == 0,导致创建多个实例。
参考《设计模式:可复用面向对象软件的基础》
方法1:加锁实现线程安全
class Singleton { private: Singleton(); //static数据成员,类中只是声明 static Singleton *instance; public: static Singleton *get_instance(); static pthread_mutex_t mutex; }; //必须类外定义static数据成员,否则报错undefined symbol pthread_mutex_t Singleton::mutex; Singleton::Singleton() { pthread_mutex_init(&mutex, NULL); cout << "code" << endl; } Singleton* Singleton::instance = 0; Singleton* Singleton::get_instance() { if (instance == 0) { pthread_mutex_lock(&mutex); if (instance == 0) instance = new Singleton(); pthread_mutex_unlock(&mutex); } return instance; }
加锁存在的问题,当线程比较多时,效率低。
方法2:内部静态变量实现线程安全
class Singleton { private: Singleton(); public: static Singleton *get_instance(); static pthread_mutex_t mutex; }; //必须类外定义static数据成员,否则报错undefined symbol pthread_mutex_t Singleton::mutex; Singleton::Singleton() { pthread_mutex_init(&mutex, NULL); cout << "code" << endl; } Singleton* Singleton::get_instance() { pthread_mutex_lock(&mutex); static Singleton instance; pthread_mutex_unlock(&mutex); return &instance; }
饿汉模式
class Singleton { private: Singleton() {}; static Singleton *instance; public: static Singleton* get_instance(); }; Singleton* Singleton::instance = new Singleton(); Singleton* Singleton::get_instance() { return instance; } int main(void) { Singleton *single1 = Singleton::get_instance(); Singleton *single2 = Singleton::get_instance(); if (single1 == single2) cout << "equal" << endl; return 0; }
2015年某wheel笔试题(未)
某wheel的笔试题目,很全面,分为数据结构、算法、数据库、计算机网络、大数据处理,每个范围一道题,考察的很全。1. map-reduce处理 word-count问题
2. 多线程编程的问题
多线程编程很多公司都会问,还有设计模式中,比如单例模式中多线程锁的问题;3. socket编程的问题
网络编程也经常被问到相关文章推荐
- Apache Beam WordCount编程实战及源码解读
- SCN问题详解(2)--传染源定位
- Smart Framework
- 挖掘算法(1)朴素贝叶斯算法
- 面试题
- C# 操作ini文件
- 如何得到天气情况?在那个接口获取?
- mysql 第18章 导入导出
- 实际项目中页面标签的使用
- Linux基本命令一の安装及管理应用程序
- 河北民间组织管理系统之民办非企业单位的项目目标文档
- 系统利益相关者描述案例
- LA 3667 Ruler 搜索
- 修改SqlServer的sa用户密码
- (四)redis 主从同步数据
- 洛谷10月月赛参·最后的狂欢
- layout_weight及常见属性(分配子View大小的一个属性)
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--防御塔(三)之初级炮塔
- 04-树5 二叉平衡树
- 字串加密