工厂模式的核心思想
核心思想就是降低耦合
工厂模式是为了使得程序统一,降低各个模块之间的耦合,达到结构清晰的目的。
降低耦合指的是:降低各个模块、各个类之间的联系,为了修改的时候可以方便,以免引起修改了一处,其他各处全需要修改,也为了将来复用代码。
举个例子,比如给一个字符串,为了统计小写、大写、数字的个数,将来还要扩展统计其他汉字、韩文等个数,首先他们有个共同的特性,就是统计个数,这就需要工厂模式了。
工厂方法设计模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
既然每次都要判断,那就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改。每次只需要修改产品子类就可以了。
打个比方:现在有A、B两种产品,那么就开两个工厂。工厂A负责生产A产品,工厂B负责生产B产品。这时候客户不需要告诉工厂生产哪种产品了,只需要告诉工厂生产就可以了。
//工厂方法设计模式.cpp : 定义控制台应用程序的入口点。
#include<iostream>
using namespace std;
enum TYPES //产品类型
{
TYPEA, TYPEB
};
class BASE //抽象产品类
{
public:
virtual void show() = 0;
};
class A :public BASE //具体A产品类
{
public:
void show()
{
cout << "A show!" << endl;
}
};
class B :public BASE //具体B产品类
{
public:
void show()
{
cout << "B show!" << endl;
}
};
class Factory //抽象工厂类
{
virtual BASE* CREATEBASE(enum TYPES c) = 0;
};
class FactoryA:public Factory //具体工厂A类
{
public:
BASE* CREATEBASE(enum TYPES c)
{
cout << "Create A!" << endl;
return new A;
}
};
class FactoryB:public Factory //具体工厂B类
{
public:
BASE* CREATEBASE(enum TYPES c)
{
cout << "Create B!" << endl;
return new B;
}
};
int main()
{
FactoryA m;
BASE *p = m.CREATEBASE(TYPEA);
p->show();
FactoryB n;
p = n.CREATEBASE(TYPEB);
p->show();
return 0;
}
工厂方法的优点
在简单工厂方法中,每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,工厂方法克服了简单工厂的缺点,增加新的产品时,不必修改现存的代码,而只需增加新代码。满足开放封闭原则。
工厂方法的缺点
每增加一个产品,就需要增加一个对应产品的工厂类,增加了额外的开发量。