API(Application Programming Interface )提供了对某个问题的抽象,以及客户与解决该软件问题的软件组件之间进行交互的方式。组件本身通常以软件类库的形式分发,它们可以在多个应用程序中使用。概括地说,API定义了一些可复用的模块,使得各个模块可以嵌入到最终用户的应用程序中去。
C++中的API通常会包含以下元素:头文件、类库、文档。
API的特征:
不使用public成员而使用private成员+getter和setter惯用法的原因:
个人觉得还有一个:
Pimpl即 Pointer to implementation 的简写,是受制于C++特性的一种特例。本质上讲,即是将私有的成员变量和函数转移到cpp文件中的方法。具体的做法是公有类持有一个私有指针,该指针指向隐藏的实现类。
|-----------------|
| 公有接口 |
|-----------------|
|public: |
| function1(); | |----------------|
| function2(); | | 私有实现 |
|-----------------| |----------------|
|protected: | |private: |
| function3(); | | function1(); |
|-----------------| | function2(); |
|private: | | data1; |
| Impl *mlmpl; ------------------------> | date2; |
|-----------------| |----------------|
要小心C++的复制语义,需要自己实现拷贝构造函数和重载赋值操作了
优点:信息隐藏、降低耦合、加速编译、更好的二进制兼容性 缺点:引入性能冲击、代码复杂
单例用来确保一个类只产生一个实例化的对象,相比全局变量的有点如下:
简单做法是将构造函数,析构函数,拷贝构造函数、赋值操作符设为私有,提供静态共有的方法返回唯一对象的引用。
C++中,不同编译单元中的非局部静态对象的初始化顺序是未定义的。
我们可以这样:
Singleton &Singleton::getInstance()
{
static Singleton instance;
return instance;
}
但是,上边的代码不是线程安全的!如果两个线程同时调用这个函数,实例就有可能被构造两次。奇葩的方法就不说了,陈硕的书中给出了一个实现,在muduo库中的实现是通过linux下的pthread_once函数实现的(不可移植)。
这些设计模式还是去系统的学学设计模式相关的书籍吧~~
待续…