设计模式----抽象工厂模式

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

   抽象工厂模式的优点:抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。

   抽象工厂模式的缺点:抽象工厂模式的缺点是在添加新的产品对象时,难以扩展抽象工厂以便生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来很多不便。

简单工厂模式:用来生产同一等级中的任意产品(不支持增加新产品)。产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的。如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支。

    工厂方法模式:用来生产同一等级结构中的固定产品(支持增加新产品)。将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。该模式更符合开发中的OCP原则(open close principle),对扩展开放,对修改关闭。

一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

    抽象工厂模式:用来生产不同产品族的全部产品(不支持产品增加,但支持产品族的增加)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

具体实例:

麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),实现这两个快餐店经营产品的抽象工厂模式。


#include<iostream>
#include<string>
using namespace std;
//定义汉堡和可乐的抽象类
class Hamburg_Cola
{
public:

    virtual void Hamburg(){};
    virtual void Cola(){};
};
//麦当劳类实现
class McDonalds:public Hamburg_Cola
{
    virtual void Hamburg()
    {
      cout<<"Hamburg from McDonalds"<<endl;
    }
    virtual void Cola()
    {
        cout<<"Cola from McDonalds"<<endl;
    }
};
class KFC:public Hamburg_Cola
{

    virtual void Hamburg()
    {
        cout<<"Hamburg from KFC"<<endl;

    }
    virtual void Cola()
    {
        cout<<"Cola from KFC"<<endl;
    }
};
class Factory{
public:
	Factory(){}
	virtual Hamburg_Cola* Create()=0;
};
class McDonalds_Factory : public Factory{
public:
	HP_Factory(){}
	Hamburg_Cola* Create(){
		return new McDonalds();
	}
};
class KFC_Factory : public Factory{
public:
	Acer_Factory(){}
	Hamburg_Cola* Create(){
		return new KFC();
	}
};

int  main()
{
   Factory* factory=new McDonalds_Factory();
   Hamburg_Cola* hamburg_cola=factory->Create();
   hamburg_cola->Hamburg();
   hamburg_cola->Cola();

  return 0;
}

猜你喜欢

转载自blog.csdn.net/archar_saber/article/details/79918344