一、背景
工厂模式提供创建对象的最佳模式,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
具体到C++项目中,可以使用C++多态特性将存在继承关系的类通过工厂类创建对应的子类对象,在项目复杂的情况下,可以便于子类对象的创建。
工厂模式主要分为三种,简单工厂模式、工厂方法模式和抽象工厂模式。
1.简单工厂模式
简单工厂模式的UML类图如下,图中主要有三个类,抽象产品类(Phone)、具体产品类(iPhone和Huawei)和工厂类(PhoneFactory)。
简单工厂模式特点:
1.工厂类封装了创建具体产品对象的函数;
2.新增产品时需要新增对应的具体产品类并且还要修改工厂类.
简单工厂类代码实例
#include <iostream>
class Phone
{
public:
virtual ~Phone() {};
virtual void show() = 0;
};
class iPhone : public Phone
{
public:
void show() override {
std::cout << "I'm Apple" << std::endl;
}
};
class Huawei : public Phone
{
public:
void show() override {
std::cout << "I'm Huawei" << std::endl;
}
};
enum PhoneType
{
IPHONE,
HUAWEI
};
class PhoneFactory
{
public:
Phone* createPhone(PhoneType kType) {
switch (kType) {
case IPHONE:
return new iPhone();
case HUAWEI:
return new Huawei();
default:
return NULL;
}
}
};
int main()
{
PhoneFactory phonefactory;
Phone* huawei = phonefactory.createPhone(HUAWEI);
if (huawei) {
huawei->show();
delete huawei;
huawei = NULL;
}
Phone* apple = phonefactory.createPhone(IPHONE);
if (apple) {
apple->show();
delete apple;
apple = NULL;
}
}
2.工厂方法模式
简单工厂模式和工厂方法模式的区别:
1.简单工厂模式包括抽象产品类、具体产品类和工厂类;而工厂方法模式包括抽象产品类,具体产品类和抽象工厂类和具体工厂类。抽象工厂类不再创建具体的产品类,而是由具体工厂类来创建;
2.新增一个产品,简单工厂模式需要增加具体产品类并且修改工厂类,而工厂方法类则是需要增加具体产品类和具体工厂类。
#include <iostream>
class Phone
{
public:
virtual ~Phone() {};
virtual void show() = 0;
};
class iPhone : public Phone
{
public:
void show() override {
std::cout << "I'm Apple" << std::endl;
}
};
class Huawei : public Phone
{
public:
void show() override {
std::cout << "I'm Huawei" << std::endl;
}
};
enum PhoneType
{
IPHONE,
HUAWEI
};
class PhoneFactory
{
public:
virtual ~PhoneFactory() {};
virtual Phone* creatPhone() = 0;
};
class iPhoneFactory : public PhoneFactory
{
public:
Phone* creatPhone() override {
return new iPhone();
}
};
class HuaweiFactory : public PhoneFactory
{
public:
Phone* creatPhone() override {
return new Huawei();
}
};
int main()
{
iPhoneFactory appleFact;
Phone* apple = appleFact.creatPhone();
apple->show();
delete apple;
HuaweiFactory huaweiFact;
Phone* huawei = huaweiFact.creatPhone();
huawei->show();
delete huawei;
}
2.抽象工厂模式
抽象工厂模式和工厂方法模式很类似,主要还是有以下四个大的类:
1.抽象产品类;
2.具体产品类;
3.抽象工厂类;
4.具体工厂类;
不同之处在于: 抽象工厂模式中抽象工厂类不只提供创建单一的抽象产品类,具体工厂类同样不再提供创建单一的具体产品类,而是可以创建多个。对于上面的例子PhoneFactory抽象工厂类不但能通过createPhone生产手机,还可以通过createPad生产平板,这也就需要新增抽象平板类Pad,和具体平板类iPad和HuaweiPad,这里画出UML类图,不再给出代码实例。