作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使一个类的实例化延迟到其子类。
工厂模式可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式;在本节,我们来讨论一下简单工厂模式和工厂方法模式。
简单工厂模式:
举个简单的例子:
肯德基可以出售两种不同风味的鸡腿,具体卖哪一种呢?由客户决定该给客户卖哪一种。下面给出一个简单的实现用例。
#include<iostream>
using namespace std;
enum CTYPE {COREA, COREB};
class Chicken
{
public:
virtual void Show() = 0;
};
//麻辣味鸡腿
class ChickenA: public Chicken
{
public:
void Show() { cout<<"鸡腿,麻辣"<<endl; }
};
//芝士味鸡腿
class ChickenB: public Chicken
{
public:
void Show() { cout<<"鸡腿,芝士"<<endl; }
};
//肯德基呢,可以卖两种鸡腿
class Factory
{
public:
Chicken* CreateChicken(enum CTYPE ctype)
{
if(ctype == COREA) //工厂内部判断
return new ChickenA(); //卖麻辣味鸡腿
else if(ctype == COREB)
return new ChickenB(); //卖芝士味鸡腿
else
return NULL;
}
};
int main()
{
Factory *m_pFactotry;
m_pFactotry->CreateChicken(COREA)->Show();
delete m_pFactotry;
return 0;
}
这就是简单的工厂模式,突然有一天,有个吃货给肯德基提议增加黑椒味的鸡腿,这下可难住肯德基了,因为如果我增加的话,我就要改变我自己呀。这不就违反了开放、封闭原则了吗?
于是,工厂方法模式就出现了。
还是以鸡腿为例说明问题吧,毕竟作为一个吃货,吃才是本职。
哎吆,肯德基经过卖鸡腿赚了钱了,这是肯德基就要考虑考虑了。为了顾客分流,肯德基用了洪荒之力开辟两个柜台,一个来卖麻辣味的鸡腿,另一个了卖芝士味鸡腿。这样想吃什么风味的鸡腿就直接去对应的柜台了嘛。
#include<iostream>
using namespace std;
class Chicken
{
public:
virtual void Show() = 0;
};
//麻辣味鸡腿
class ChickenA: public Chicken
{
public:
void Show() { cout<<"鸡腿,麻辣"<<endl; }
};
//芝士味鸡腿
class ChickenB: public Chicken
{
public:
void Show() { cout<<"鸡腿,芝士"<<endl; }
};
//肯德基
class Factory
{
public:
virtual Chicken* CreateChicken()= 0;
};
//柜台A,专卖麻辣鸡腿
class FactoryA: public Factory
{
public:
ChickenA * CreateChicken()
{
return new ChickenA;
}
};
//柜台B,专卖芝士鸡腿
class FactoryB: public Factory
{
public:
ChickenB * CreateChicken()
{
return new ChickenB;
}
};
int main()
{
Factory *p = new FactoryB();
p->CreateChicken()->Show();
Factory *q = new FactoryA();
q->CreateChicken()->Show();
delete q;
delete p;
return 0;
}
当然这样做的结果是,肯德基只要每增加一种口味的鸡腿就要新开辟一块柜台来卖这种口味的鸡腿,为了节约成本,啃得鸡提出了新方案来解决这个问题,就要引出后面的抽象工厂了。好的。抽象工厂模式我们下次来讨论,不见不散!
这是我自己理解的Factory模式。
这是网上找的UML图: