您的位置:首页 > 其它

设计模式

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编程的问题

网络编程也经常被问到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  word-count