工厂模式是最常用的设计模式之一,它提供了一种创建对象的最佳方式,在创建对象的时候,不会对客户端暴露创建逻辑,并且通过使用一个共同的接口来创建新的对象。
通过传?相关的类型来返回相应的类对象,简单工厂模式看为工厂方法模式的一种特例。
下面以生成手机的代码为例,介绍简单工厂模式,UML类图如下:
代码实现,如下:
#include <iostream>
using namespace std;
// 手机(抽象接口)
class IPhone {
public:
virtual void Describe() = 0;
};
// 华为手机(具体产品)
class HuaweiPhone : public IPhone {
public:
void Describe() {
cout << "华为手机" << endl;
}
};
// 苹果手机(具体产品)
class ApplePhone : public IPhone {
public:
void Describe() {
cout << "苹果手机" << endl;
}
};
// 简单工厂
class PhoneFactory {
public:
IPhone* Produce(string type) {
IPhone *pPhone = nullptr;
if (type == "Huawei") {
pPhone = new HuaweiPhone;
} else if (type == "Apple") {
pPhone = new ApplePhone;
}
return pPhone;
}
};
int main()
{
// 简单工厂
PhoneFactory factory;
IPhone *pHuaweiPhone = factory.Produce("Huawei");
IPhone *pApplePhone = factory.Produce("Apple");
pHuaweiPhone->Describe();
pApplePhone->Describe();
return 0;
}
简单工厂模式优点与缺点,如下:
优点:
缺点:
PhoneFactory::Produce
方法,违反了开放封闭原则定义创建对象抽象工厂,具体工厂负责实现抽象工厂接口,创建对应类型的对象
#include <iostream>
using namespace std;
// 手机(抽象接口)
class IPhone {
public:
virtual void Describe() = 0;
};
// 华为手机(具体产品)
class HuaweiPhone : public IPhone {
public:
void Describe() {
cout << "华为手机" << endl;
}
};
// 苹果手机(具体产品)
class ApplePhone : public IPhone {
public:
void Describe() {
cout << "苹果手机" << endl;
}
};
// 抽象工厂
class IFactory {
public:
virtual IPhone* Produce() = 0;
};
// 具体工厂(生产华为手机)
class HuaweiPhoneFactory : public IFactory {
public:
IPhone* Produce() {
return new HuaweiPhone;
}
};
// 具体工厂(生产苹果手机)
class ApplePhoneFactory : public IFactory {
public:
IPhone* Produce() {
return new ApplePhone;
}
};
int main()
{
// 工厂对象
HuaweiPhoneFactory huaweiFactory;
ApplePhoneFactory appleFactory;
IPhone *pHuaweiPhone = huaweiFactory.Produce();
IPhone *pApplePhone = appleFactory.Produce();
pHuaweiPhone->Describe();
pApplePhone->Describe();
return 0;
}
工厂模式优点与缺点,如下:
优点:
缺点: