设计模式C++描述----03.工厂(Factory)模式 (二)

2014-11-24 12:03:50 · 作者: · 浏览: 1
virtual Product* CreateProduct() = 0;
};

//生产A的工厂
class FactoryA: public Factory
{
public:
Product* CreateProduct()
{
return new ProductA;
}
};

//生产B的工厂
class FactoryB: public Factory
{
public:
Product* CreateProduct()
{
return new ProductB;
}
};

int main()
{
Factory* fac = new FactoryA(); //A工厂

Product* p = fac->CreateProduct(); //生产产品

p->Show();

return 0;
}
其实你会发现,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。

这有什么好处呢?举个例子,有三个客户原来要A产品,现在改卖B产品,在代码中体现为:

简单工厂的处理:

[cpp] Factory fac; //工厂

Product *pro1 = fac.CreateProduct(PRODUCT_A);//生产产品A
Product *pro2 = fac.CreateProduct(PRODUCT_A);//生产产品A
Product *pro3 = fac.CreateProduct(PRODUCT_A);//生产产品A

//改为B产品,这里要改三个地方
//Product *pro1 = fac.CreateProduct(PRODUCT_B);//生产产品B
//Product *pro2 = fac.CreateProduct(PRODUCT_B);//生产产品B
//Product *pro3 = fac.CreateProduct(PRODUCT_B);//生产产品B

pro1->Show();
pro2->Show();
pro3->Show();
Factory fac; //工厂

Product *pro1 = fac.CreateProduct(PRODUCT_A);//生产产品A
Product *pro2 = fac.CreateProduct(PRODUCT_A);//生产产品A
Product *pro3 = fac.CreateProduct(PRODUCT_A);//生产产品A

//改为B产品,这里要改三个地方
//Product *pro1 = fac.CreateProduct(PRODUCT_B);//生产产品B
//Product *pro2 = fac.CreateProduct(PRODUCT_B);//生产产品B
//Product *pro3 = fac.CreateProduct(PRODUCT_B);//生产产品B

pro1->Show();
pro2->Show();
pro3->Show();工厂方法的处理:


[cpp] Factory* fac = new FactoryA(); //A工厂

//改为B产品,这里只改一个地方
//Factory* fac = new FactoryB(); //B工厂

Product* pro1 = factory_A->CreateProduct(); //生产产品
Product* pro2 = factory_A->CreateProduct(); //生产产品
Product* pro3 = factory_A->CreateProduct(); //生产产品

pro1->Show();
pro2->Show();
pro3->Show();
Factory* fac = new FactoryA(); //A工厂

//改为B产品,这里只改一个地方 www.2cto.com
//Factory* fac = new FactoryB(); //B工厂

Product* pro1 = factory_A->CreateProduct(); //生产产品
Product* pro2 = factory_A->CreateProduct(); //生产产品
Product* pro3 = factory_A->CreateProduct(); //生产产品

pro1->Show();
pro2->Show();
pro3->Show();这里可以看到工厂方法的好处了吧,工厂方法模式是简单工厂模式的进一步抽象和推广,它集中封装了对象的创建,使得要更换产品时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合。


优点:

相对于简单工厂模式来说,这样分工更加明确,当需要新产品时,就建一个新的工厂,而不是对原工厂类进行修改。这样做满足了"开放-封闭"原则,即可以扩展,不可修改。


缺点:

1. 每增加一种产品,就需要增加一个对象的工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

2. Factory 模式仅仅局限于一类类(就是说 Product 是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。


打个比方:


如果这家公司发展迅速,推出了很多新的产品,那么就要开设相应的新工厂,一种产品一个工厂。这对于客户来说是好事,分工明确了白;但对于工厂自己来说开销也变大了。

如要我想要生产核心芯片,但是芯片不是产品,不能继承于product类。因为产品和零部件,不是一类。


三. 抽象工厂模式


抽象工厂模式,它定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

还以上面的例子解释,这家公司经营的还不错,针对其核心技术都申请了专利,后来生始生产相关电子芯片了 (像三星一样,即生产产品也生产芯片)。对于这种情况,我们不能在抽象产品类上继承一个零部件,因为产品和芯片没有什么共同之处,完全是两个领域。你要做芯片,就要专心做,当成一个新的领域,不能用以前产品的那一套流程。这样划分才明确,才能更好的实现高内聚,低耦合的明标。

\


[cpp] //抽象产品类
class Product
{
public:
virtual void Show() = 0;
};

//产品A
class ProductA: public Product
{
public:
void Show()
{
cout<<"Product A"< }
};

//产品B
class ProductB: public Product
{
public:
void Show()
{
cout<<"Product B"< }
};

//抽象芯片类
class Chip
{
public:
virtual void Show() = 0;
};

//芯片A
class ChipA: public Chip
{
public:
void Show()
{
cout<<"Chip A"< }
};

//芯片B
class ChipB: public Chip
{
public:
void Show()
{
cout<<"Chip B"< }
};