以一个Person类为接口类,Student类为实现类的代码为例:
1. Person.h声明了Person类,PersonCreator类,并定义了一个全局变量用来创建Student对象
#pragma once
class Person
{
public:
virtual ~Person() {}
virtual void Eat() = 0;
virtual void Sleep() = 0;
};
class PersonCeator
{
public:
~PersonCeator();
Person* CreateStudent();
};
extern PersonCeator* g_creator;
2. Student.cpp声明了Student类,并实现了Student类和PersonCreator类:
#include <iostream>
#include "Person.h"
using namespace std;
class Student : Person
{
public:
Student();
virtual ~Student();
virtual void Eat();
virtual void Sleep();
};
Student::Student()
{
cout << "创建Student" << endl;
}
Student::~Student()
{
cout << "析构Student" << endl;
}
void Student::Eat()
{
cout << "吃饭" << endl;
}
void Student::Sleep()
{
cout << "睡觉" << endl;
}
Person* PersonCeator::CreateStudent()
{
Student* student= new Student();
//Student student;
return (Person*)student;
}
PersonCeator::~PersonCeator()
{
cout << "析构PersonCreator" << endl;
}
PersonCeator creator;
extern PersonCeator* g_creator = &creator;//这样创建会在main函数运行结束后自动析构
//extern PersonCeator* g_creator= new PersonCeator();//这样创建需要手动析构
3. main.cpp使用PersonCreator创建Student对象:
#include <iostream>
#include "Person.h"
int main()
{
Person* Tom = g_creator->CreateStudent();
Tom->Eat();
Tom->Sleep();
delete Tom; //手动析构
//delete g_creator;
getchar();
return 0;
}
实际上PersonCreator中的create()函数的返回值是Person类的指针,这样能够彻底地隐藏Student类的存在。同时,也应该注意到,一个模块很有可能是以动态库被其他模块调用,所以当对象是在本模块new时,也应当在本模块delete。所以接口类应该提供Release()方法。修改后的代码如下:
1. Person.h声明了IPerson类,IPersonCreator类,并定义了一个全局变量用来创建Student对象
#pragma once
class IPerson
{
public:
virtual ~IPerson() {}
virtual void Release() = 0;
virtual void Eat() = 0;
virtual void Sleep() = 0;
};
class IPersonCreator
{
public:
virtual ~IPersonCreator() {}
virtual IPerson* CreateStudent() = 0;
};
extern IPersonCreator* g_pCreator;
2. Student.cpp声明并实现了Student类和PersonCreator类:
#include <iostream>
#include "Person.h"
using namespace std;
//
//
// 声明类Student和PersonCreator
//
//
class Student : public IPerson
{
public:
Student();
virtual ~Student();
virtual void Release();
virtual void Eat();
virtual void Sleep();
private:
char* name;
};
class PersonCreator : public IPersonCreator
{
public:
PersonCreator();
virtual ~PersonCreator();
virtual IPerson* CreateStudent();
void ReleasePerson(IPerson* pPerson);
};
PersonCreator creator;
IPersonCreator* g_pCreator = &creator;//这样创建会在main函数运行结束后自动析构
//
//
// 实现类Student
//
//
Student::Student()
{
name = new char[255]();
cout << "创建Student" << endl;
}
Student::~Student()
{
delete[] name;
cout << "析构Student" << endl;
}
void Student::Release()
{
creator.ReleasePerson(this);
}
void Student::Eat()
{
cout << "吃饭" << endl;
}
void Student::Sleep()
{
cout << "睡觉" << endl;
}
//
//
// 实现类PersonCreator
//
//
PersonCreator::PersonCreator()
{
cout << "创建PersonCreator" << endl;
}
PersonCreator::~PersonCreator()
{
cout << "析构PersonCreator" << endl;
}
IPerson* PersonCreator::CreateStudent()
{
Student* student = new Student();
return (IPerson*)student;
}
void PersonCreator::ReleasePerson(IPerson* pPerson)
{
if (pPerson)
{
delete pPerson;
}
}
3. main.cpp使用接口IPersonCreator创建Student对象,使用完之后需要析构Student对象,程序结束后会自动释放PersonCreator对象。
#include <iostream>
#include "Person.h"
int main()
{
IPerson* Tom = g_pCreator->CreateStudent();//使用时不需强制转换了
Tom->Eat();
Tom->Sleep();
Tom->Release();
Tom = nullptr;
getchar();
return 0;
}