您的位置:首页 > 其它

工厂方法模式

2016-02-26 10:45 204 查看
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭 原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。

#include <string>
#include <iostream>

//小米手机产品类
class IXiaoMi
{
public:
IXiaoMi(void);
public:
virtual ~IXiaoMi(void);
public:
virtual bool MakeCall(const std::string & number) const = 0;
};

IXiaoMi::IXiaoMi(void)
{
}

IXiaoMi::~IXiaoMi(void)
{
}

//小米2型号的小米手机产品类
class CXiaoMi2 : public IXiaoMi
{
public:
CXiaoMi2(void);
public:
virtual ~CXiaoMi2(void);
public:
virtual bool MakeCall(const std::string & number) const;
};

CXiaoMi2::CXiaoMi2(void)
{
std::cout << "生产一部小米2" << std::endl;
}

CXiaoMi2::~CXiaoMi2(void)
{
}

bool CXiaoMi2::MakeCall(const std::string & number) const
{
std::cout << "我在用小米2,拨打号码是:" <<  number.c_str() << std::endl;
return false;
}
//
class CFactoryMethod
{
public:
CFactoryMethod(void);
public:
virtual ~CFactoryMethod(void);
public:
virtual IXiaoMi * CreateXiaoMiPhone(void) = 0;
};

CFactoryMethod::CFactoryMethod(void)
{
}

CFactoryMethod::~CFactoryMethod(void)
{
}

//小米2的工厂
class CXiaoMi2Factory : public CFactoryMethod
{
public:
CXiaoMi2Factory(void);
public:
virtual ~CXiaoMi2Factory(void);
public:
virtual IXiaoMi * CreateXiaoMiPhone(void);
};

CXiaoMi2Factory::CXiaoMi2Factory(void)
{
}

CXiaoMi2Factory::~CXiaoMi2Factory(void)
{
}

IXiaoMi * CXiaoMi2Factory::CreateXiaoMiPhone(void)
{
return new CXiaoMi2();
}

//客户端通过建立小米2工厂生产小米手机
int main()
{
CFactoryMethod *pMethod = new CXiaoMi2Factory();
IXiaoMi *pXiaoMi = pMethod->CreateXiaoMiPhone();
pXiaoMi->MakeCall("123456789");

if (pMethod)
{
delete pMethod; pMethod=0;
}
if (pXiaoMi)
{
delete pXiaoMi; pXiaoMi=0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: