设计模式-单件

static变量从某种意义上说就是一个单件,也就是只有一个对象将被创建。它的分创建时机是:当它作为一个类成员变量时,只有当类被创建或说是被分配内存空间时才会创建;如果它是一个函数(包括类的成员函数),里时,只是当成员函数第一次被使用时才会被创建。

首先,我们提供一个文件的单件,为我们在使用文件输入输出时提供方便:

//:LogFile.h
#ifndef LOGFILE_H
#define LOGFILE_H
#include <fstream>
std::ofstream& ologfile();
std::ifstream& ilogfile();
#endif // LOGFILE_H ///:~
 
//:LogFile.cpp {O}
#include "LogFile.h"
std::ofstream& ologfile() {
  static std::ofstream olog( "oLogfile.log");
  return olog;
}
std::ifstream& ilogfile() {
  static std::ifstream ilog("ilogfile.log");
  return ilog;
} ///:~

此时olog和ilog对象将在ologfile()和ilogfile()被调用时创建,所以如果创建以下函数:

//:UseLog1.h
#ifndef USELOG1_H
#define USELOG1_H
void f();
#endif // USELOG1_H ///:~
 
此时ologfile()被使用:
//:UseLog1.cpp {O}
#include "UseLog1.h"
#include "LogFile.h"
void f() {
  ologfile() << __FILE__ << std::endl;
} ///:~
 
同时创建另外一个函数:
//: C10:UseLog2.cpp
//{L} LogFile UseLog1
#include "UseLog1.h"
#include "LogFile.h"
using namespace std;
void g() {
  ologfile() << __FILE__ << endl;
}
 
int main() {
  f();
  g();
} ///:~
 
olog将在f()在main中使用时被创建。
在此我们可以将logfile.h和logfile.cpp保存起来供以后使用,而不必每次重复的去写输入输出文件了。
 
这是《thinking in C++》中提供的一个单件设计模式,他使用的是引用:
 
//:SingletonPattern.cpp
#include <iostream>
using namespace std;
 
class Singleton {
  int i;
  Singleton( int x) : i(x) { }
  ~Singleton(){}
  void operator=(Singleton&);
  Singleton( const Singleton&);
public:
  static Singleton& instance() {
    static Singleton s(47);
    return s;
  }
  int getValue() { return i; }
  void setValue( int x) { i = x; }
};
 
int main() {
  Singleton& s = Singleton::instance();
  cout << s.getValue() << endl;
  Singleton& s2 = Singleton::instance();
  s2.setValue(9);
  cout << s.getValue() << endl;
} ///:~
这里我们注意到在Singleton中构造函数,析构函数,赋值函数,拷贝函数都被私有化,而且赋值函数及自初始化往复运动数没有提供实现,这就杜绝了通过其它途径创建一个对象,只有在静态成员函数instance()被调用时才会唯一的创建一个静态对象。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值