通过私有(private)继承复用类实现工厂函数(factory function) 详解
版权归C.L.Wang所有, 禁止转载, 如有需要, 请站内联系.
本文地址: http://blog.csdn.net/caroline_wendy/article/details/23750515
通过接口类(interface class), 实现工厂函数, 可以复用(reuse)已有类, 重写实现接口.
如:
接口类: IPerson; 复用类: PersonInfo; 实现类: CPerson;
工厂函数: DatabaseID askUserForDatabaseID(); std::shared_ptr<IPerson> makePerson(DatabaseID personIndetifier);
可以通过私有继承复用类PersonInfo,公有继承接口类IPerson, 并重写相关接口, 即界定符(delim),实现类CPerson的要求.
代码如下:
/*
* test.cpp
*
* Created on: 2014.04.14
* Author: Spike
*/
/*eclipse cdt, gcc 4.8.1*/
#include <cstring>
#include <iostream>
#include <string>
#include <memory>
using namespace std;
class IPerson {
public:
virtual ~IPerson() = default;
virtual std::string name() const = 0;
virtual std::string birthDate() const = 0;
};
struct DatabaseID {
char name[256];
char birthDate[256];
};
class PersonInfo {
public:
explicit PersonInfo(DatabaseID pid){
std::strcpy(m_name, pid.name);
std::strcpy(m_birthDate, pid.birthDate);
}
virtual ~PersonInfo() = default;
virtual const char* theName() const;
virtual const char* theBirthDate() const;
protected:
virtual const char* valueDelimOpen() const { return "["; };
virtual const char* valueDelimClose() const { return "]"; };
private:
char m_name[256];
char m_birthDate[256];
static const int Max_Formatted_Filed_Value_Length = 512;
};
const char* PersonInfo::theName() const {
static char value[Max_Formatted_Filed_Value_Length];
std::strcpy(value, valueDelimOpen());
std::strcat(value, m_name);
std::strcat(value, valueDelimClose());
return value;
}
const char* PersonInfo::theBirthDate() const {
static char value[Max_Formatted_Filed_Value_Length];
std::strcpy(value, valueDelimOpen());
std::strcat(value, m_birthDate);
std::strcat(value, valueDelimClose());
return value;
}
class CPerson : public IPerson, private PersonInfo {
public:
explicit CPerson(DatabaseID pid) : PersonInfo(pid) {}
virtual std::string name() const { return PersonInfo::theName(); }
virtual std::string birthDate() const { return PersonInfo::theBirthDate(); }
private:
const char* valueDelimOpen() const { return "---"; }
const char* valueDelimClose() const { return "---"; }
};
std::shared_ptr<IPerson> makePerson(DatabaseID personIndetifier) {
std::shared_ptr<IPerson> pP = std::make_shared<CPerson>(personIndetifier);
return pP;
}
DatabaseID askUserForDatabaseID() {
DatabaseID di;
std::strcpy(di.name, "Liu");
std::strcpy(di.birthDate, "1998.9.25");
return di;
}
int main() {
DatabaseID id(askUserForDatabaseID());
std::shared_ptr<IPerson> pp(makePerson(id));
std::cout << pp->name() << std::endl;
std::cout << pp->birthDate() << std::endl;
return 0;
}
输出:
---Liu---
---1998.9.25---