一、 模式定义
Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
二、 特点
- 良好的封装性,代码结构清晰。只需要知道创建的产品类,而无需了解创建对象的具体过程,降低模块间的耦合
- 扩展性优秀。如果需要新增加产品类,只需要适当修改工厂类并扩展一个产品类即可,在 “拥抱变化” 上,其具有很实用的意义。
- 屏蔽了产品类,其是一个典型的解耦框架。高层模块只需要知道产品的抽象类,即可对产品进行使用。工厂方法符合迪米特法则、符合依赖倒置原则以及里氏替换原则。
三、 工厂方法模式示例代码
/*****************************************************************
* Copyright (c) Bingwu 2019. All rights reserved.
* Filename : FactoryPattern.cpp
* Description: 工厂方法模式
* Author : Bingwu
* Create time: 2019-07-01 08:40:33
* Last time : 2019-07-01 11:37:46
* Blog : https://blog.csdn.net/AloneFar
* Motto : 齐烟九点 意尽天明
*****************************************************************/
#include <iostream>
typedef enum _human_type_e
{
E_HUMAN_BLACK = 0,
E_HUMAN_WHITE,
E_HUMAN_YELLOW,
}HUMAN_TYPE_E;
class CHuman
{
public:
CHuman() {}
virtual ~CHuman() {}
virtual void Speak() = 0;
};
class CBlackMan:public CHuman
{
public:
CBlackMan() {}
~CBlackMan() {}
void Speak() { std::cout << "我是黑种人" << std::endl; }
};
class CWhiteMan:public CHuman
{
public:
CWhiteMan() {}
~CWhiteMan() {}
void Speak() { std::cout << "我是白种人" << std::endl; }
};
class CYellowMan:public CHuman
{
public:
CYellowMan() {}
~CYellowMan() {}
void Speak() { std::cout << "我是黄种人" << std::endl; }
};
class CHumanFactory
{
public:
CHumanFactory() {}
~CHumanFactory() {}
CHuman * CreateHuman(HUMAN_TYPE_E eHumanType);
};
/*****************************************************************
* Function : CHuman * CreateHuman(HUMAN_TYPE_E eHumanType)
* Description: 根据传入得类型创建对应的人类肤色实体
* Param : eHumanType - 肤色类型 HUMAN_TYPE_E
* Return : 对应肤色实体
* Create time: 2019-07-01 11:19:18
*****************************************************************/
CHuman * CHumanFactory::CreateHuman(HUMAN_TYPE_E eHumanType)
{
CHuman * pHuman = NULL;
switch (eHumanType)
{
case E_HUMAN_BLACK:
{
pHuman = new CBlackMan();
break;
}
case E_HUMAN_WHITE:
{
pHuman = new CWhiteMan();
break;
}
case E_HUMAN_YELLOW:
{
pHuman = new CYellowMan();
break;
}
default:
break;
}
return pHuman;
}
class CNvWa
{
public:
CNvWa() { m_HumanFactory = NULL; }
~CNvWa() {}
bool CreateYinYangLu()
{
m_HumanFactory = new CHumanFactory();
return (NULL == m_HumanFactory) ? false : true;
}
CHuman * CreateHuman(HUMAN_TYPE_E eHumanType)
{
if (NULL == m_HumanFactory)
{
return NULL;
}
return m_HumanFactory->CreateHuman(eHumanType);
}
private:
CHumanFactory * m_HumanFactory;
};
int main()
{
CNvWa * pNvWa = new CNvWa();
if (NULL == pNvWa)
{
exit(-1);
}
if (!pNvWa->CreateYinYangLu())
{
std::cout << "女娲创建阴阳八卦炉失败" << std::endl;
exit(-1);
}
else
{
std::cout << "女娲创建阴阳八卦炉成功" << std::endl;
}
CHuman * pPeople1 = pNvWa->CreateHuman(E_HUMAN_BLACK);
CHuman * pPeople2 = pNvWa->CreateHuman(E_HUMAN_WHITE);
CHuman * pPeople3 = pNvWa->CreateHuman(E_HUMAN_YELLOW);
pPeople1->Speak();
pPeople2->Speak();
pPeople3->Speak();
return 0;
}