运行在vs2022,x86,debug下。
30. 外观模式
- 为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。
- 应用:如在游戏开发中,游戏引擎包含多个子系统,如物理、渲染、粒子、ui、音频等。可以使用外观模式来封装这些复杂的子系统,提供一个简单的接口给游戏开发者,从而无需直接操作复杂的子系统,简化了开发流程。
- 实现
- 子系统。
- 外观,提供统一的接口。
- 客户端。
- 代码如下。
- 游戏引擎外观(gameenginefacade类)使用单例模式,确保在整个游戏中只有一个外观实例,从而统一管理子系统资源。
// 物理引擎子系统
class physicssystem
{
public:
void init() { cout << "initializing physics engine..." << endl;}
void update() { cout << "updating physics..." << endl; }
};
//渲染子系统
class graphicssystem
{
public:
void init() { cout << "initializing graphics..." <<endl; }
void render() { cout << "rendering graphics..." << endl;}
};
//粒子子系统
class particlesystem
{
public:
void init() { cout << "initializing particle..." << endl; }
void createparticle() { cout << "creating particle..." << endl; }
};
//游戏引擎外观
class gameenginefacade
{
private:
physicssystem* physics;
graphicssystem* graphics;
particlesystem* particle;
gameenginefacade() //私有构造函数
{
physics = new physicssystem();
graphics = new graphicssystem();
particle = new particlesystem();
}
~gameenginefacade() //私有析构函数
{
if (physics)
{
delete physics;
physics = nullptr;
}
if (graphics)
{
delete graphics;
graphics = nullptr;
}
if (particle)
{
delete particle;
particle = nullptr;
}
}
gameenginefacade(const gameenginefacade&) = delete; //删除拷贝构造函数
gameenginefacade& operator=(const gameenginefacade&) = delete; //删除赋值运算符
gameenginefacade(gameenginefacade&&) = delete; //删除移动构造函数
gameenginefacade& operator=(gameenginefacade&&) = delete; //删除移动赋值运算符
public:
static gameenginefacade* getinstance() //静态函数,获取实例
{
static gameenginefacade instance; //局部静态变量,存储实例
return &instance;
}
void initgame() {
graphics->init();
physics->init();
particle->init();
}
void updategame() {
physics->update();
particle->createparticle();
}
void rendergame() {
graphics->render();
}
};
int main()
{
gameenginefacade* gameengine = gameenginefacade::getinstance();
gameengine->initgame();
gameengine->updategame();
}
反汇编分析,子系统资源创建到释放过程
- 第一次调用getinstance() 获取外观实例时:_init_thread_header()和_init_thread_footer()是多线程同步函数,确保局部静态变量初始化是线程安全的。gameenginefacade()构造函数来创建实例,_atexit()注册实例的析构函数。如下图。
- 执行完构造函数,创建了三个子系统,如下图。
- main()返回,如下图。
- _exit()执行析构函数或atexit注册的函数指针,最后结束程序,如下图。
- 执行atexit注册的外观实例的析构函数,将三个子系统资源释放。
发表评论