软件中,有时需要将对象的创建与使用分离,这时就需要简单工厂模式了。
一、简单工厂模式的三个角色
1)工厂(Factory)角色: 简单工厂模式的核心,它负责实现创建所有的实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2)抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3)具体产品(Concrete Product)角色:简单工厂模式所创建的具体实例对象。
二、适用场景
1)工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
三、工厂模式的优缺点
1)优点
1.1) 实现了对象创建和使用的分离;
1.2) 不需要记住具体类名,记住参数即可,减少使用者的记忆负担。
2) 缺点:
2.1)对工厂类职责过重,一旦不能工作,系统受到影响;
2.2)增加系统中类的个数,复杂度和理解度增加;
2.3)违反"开闭原则",添加新产品需要修改工厂逻辑,工厂越来越复杂。
四、案例
4.1 原设计 ver1.1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
Fruit(string kind){
if (this->kind == "apple")
{
}
else if (this->kind == "banana")
{
}
}
void getName(){
if (this->kind == "apple")
{
cout << "I am apple" << endl;
}
else if (this->kind == "banana")
{
cout << "I am banana" << endl;
}
}
private:
string kind; //水果的种类
};
//工厂模式的目的,就是让业务层和类的构造函数之间解耦合,
//尽量降低一个类的复杂度
int main(void)
{
//要一个苹果
Fruit apple("apple");
apple.getName();
Fruit banana("banana");
banana.getName();
return 0;
}
4.2)加入了简单工厂模式的设计 ver1.2
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//水果类
class Fruit
{
public:
virtual void getName() = 0;
};
class Apple :public Fruit
{
public:
virtual void getName(){
cout << "apple..." << endl;
}
};
class Banana :public Fruit
{
public:
virtual void getName(){
cout << "banana..." << endl;
}
};
//一个工厂
class Factory
{
public:
//水果的生产器
Fruit* createFruit(string kind){
if (kind == "apple")
{
return new Apple;
}
else if (kind == "banana")
{
return new Banana;
}
}
};
int main(void)
{
Factory *factory = new Factory;
//要一个苹果
Fruit *apple = factory->createFruit("apple");
apple->getName();
//要香蕉
Fruit *banana = factory->createFruit("banana");
banana->getName();
return 0;
}
版本ver1.2 比ver1.1代码的可维护性、可扩展性要好。