工厂模式也是设计模式中应用较为广泛的一种模式,而且这种模式的类型又相对丰富,主要可以分成三种工厂模式。
首先是简单工厂模式,又称之为静态工厂模式,也是工厂模式中最为简单的一种模式了。简单工厂模式的目的很简单,就是定义一个创建对象的接口。主要包含两个概念,一个是工厂角色,另一个是产品角色。而工厂就是提供一系列的接口以供给具体的产品角色进行实例化。这一个概念其实和C++的多态很相近,在C++的多态中,可以通过重载完成。工厂模式对于具体的产品,也是通过这一方式进行实例化!而简单工厂模式虽然应用很广泛,但是其实本身并不属于23种设计模式之一
如果用UML关系来表示工厂模式的话,那么工厂与产品之间的关系就是一种实现的关系,由于产品都是从工厂中继承了接口的,因而简单工厂模式的UML关系图如下:
就拿上次的考核中的第二题而言,其中的职业就可以通过简单工厂模式进行实现。
职业本身可以作为一个基类,也就是作为一个工厂的角色,而旗下的各个职业类别可以作为之类,从而对其进行继承,并独自将其实现出各种职业特色的产品。
通过一个基本的职业类,提供相关的接口,而这些接口是职业的一些公共的属性。而对于其中一些具体的职业,可以通过继承Job这个基类而实现。
#ifndef FACTORY_H
#define FACTORY_H
class factoryJob
{
public:
char *jobname;
int jobID;
void jobStyle();
protected:
private:
};
class fish:public factoryJob
{
public:
void jobStyle();
bool jobState();
};
class farm:public factoryJob
{
public:
void jobStyle();
bool jobState();
};
class garw:public factoryJob
{
public:
void jobStyle();
bool jobState();
};
#endif
运行之后的结果为:
而第二种工厂模式称之为工厂方法模式,这个相对与简单工厂模式而言,要稍微复杂一点。工厂方法模式和简单工厂模式想比较,中间相当于多了一个环节。相当于把产品和工厂之间再进行一个抽象,中间多出了一个抽象层。
对于具体产品的实现,有我们中间抽象层来负责,而之前的工厂则再度被抽象层一个工厂核心,而同时对于具体产品的实现,也有一个抽象层---抽象产品角色。通过抽象产品角色和抽象工厂就可以完成具体产品角色的实现。
这个设计模式可能在理解上并不是很好理解,因为对于产品的实现而言,比简单工厂多了一个环节,具体产品的实现不能单独依靠他的父类了,而是需要抽象产品角色和抽象工厂两者共同写作才可以实现。
工厂方法模式和简单工厂模式最大的区别就在于对工厂角色和产品角色再度进行一次抽象。所以,这里的四个成员的关系如下所示:
从图中可以看得出,与简单工厂模式想比较,具体产品的实现已经不用直接依赖与核心的抽象工厂了,而是可以通过具体工厂角色机型选取实现了。
这个过程虽然理解起来容易,但是还是需要通过代码实际验证。
#ifndef FACTORY_METHOD_H_
#define FACTORY_METHOD_H_
//先创建一个产品的抽象类
class product
{
public:
virtual void CreateProduct() =0;
virtual bool ProductState() =0;
};
//创建一个抽象的工厂类
class factorymethod
{
public:
virtual product *Create() =0;
};
//创建实际的工厂类
class factoryOne:public factorymethod
{
virtual product*Create();
};
class factoryTwo:public factorymethod
{
virtual product*Create();
};
//创建实际的产品类
class productOne:public product
{
void CreateProduct();
bool ProductState();
};
class productTwo:public product
{
void CreateProduct();
bool ProductState();
};
#endif
从上述代码中可以看得出,整个工厂方法模式就是将工厂类和产品类都进行抽象,通过制定的工厂生产制定的产品来完成。
显然,与简单工厂模式想比较而言,工厂方法模式不会使工厂类过于繁杂,对于需要对产品进行更改的时候,只需要对对应的产品类进行修改即可,而不用改动到其他的部分。但是工厂方法模式也有弊端,就是当我要生产的产品很多的时候,工厂方法就需要每一个都创建一个具体的生产的工厂类,这样的话也会造成一些麻烦,因此,基于这个特点,又有了一种新的工厂设计模式。