您的位置:首页 > 其它

抽象工厂模式

2017-08-20 09:46 120 查看
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。



对于工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产多个产品。

抽象工厂:能同时生产一个产品族(多个产品)。===》抽象工厂存在原因

重要区别:

工厂模式只能生产一个产品。(要么香蕉、要么苹果)

抽象工厂可以一下生产一个产品族(里面有很多产品组成)

角色及职责

抽象工厂(Creator)角色

抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。

具体工厂( Concrete Creator)角色

具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。只生产一个具体的产品实例。

抽象产品(Product)角色

抽象工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

抽象工厂模式所创建的具体实例对象,里面有具体产品的属性,均继承自抽象产品类,





案例

#include<iostream>
using namespace std;

/*抽象产品--作为抽象工厂的依赖*/
class Fruit
{
public:
virtual void SayName()=0;
};

/*抽象工厂--里面有产品线(产品线是固定的,这是缺点)*/
class AbstractFactory
{
public:
virtual Fruit* CreateBanana()=0;
virtual Fruit* CreateApple()=0;
};

/*具体产品1--北方香蕉*/
class NorthBanana:public Fruit
{
virtual void SayName()
{
cout<<"我是北方香蕉"<<endl;
}
};

/*具体产品2--北方苹果*/
class NorthApple:public Fruit
{
virtual void SayName()
{
cout<<"我是北方苹果"<<endl;
}
};

/*具体产品3--南方香蕉*/
class SouthBanana:public Fruit
{
virtual void SayName()
{
cout<<"我是南方香蕉"<<endl;
}
};

/*具体产品3--南方苹果*/
class SouthApple:public Fruit
{
virtual void SayName()
{
cout<<"我是南方苹果"<<endl;
}
};

/*具体工厂1--北方工厂*/
class NorthFactory:public AbstractFactory
{
virtual Fruit* CreateBanana()
{
return new NorthBanana;
}

virtual Fruit* CreateApple()
{
return new NorthApple;
}
};

/*具体工厂2--南方工厂*/
class SouthFactory:public AbstractFactory
{
virtual Fruit* CreateBanana()
{
return new SouthBanana;
}

virtual Fruit* CreateApple()
{
return new SouthApple;
}
};

/*测试案例*/
int main261()
{
Fruit * fruit = NULL;//抽象产品
AbstractFactory *af = NULL;//抽象工厂

af = new SouthFactory;//创建北方工厂

fruit = af->CreateApple();//生产苹果
fruit->SayName();
delete fruit;//内存回收

fruit = af->CreateBanana();//生产香蕉
fruit->SayName();
delete fruit;

delete af;

af = new NorthFactory;//创建南方工厂

fruit = af->CreateApple();//生产苹果
fruit->SayName();
delete fruit;

fruit = af->CreateBanana();//生产香蕉
fruit->SayName();
delete fruit;

delete af;//内存回收

return 0;
}


总结

抽象工厂相比普通的工厂方法模式,在代码上表现为,抽象工厂里面的成员函数变多了,每一个成员函数在具体工厂被重写以后,又都能产生一种具体的产品,所以一个具体工厂便能够产生多个产品的实例。在生活中,便是生产复杂的产品线,比如有几个档次的产品,每个档次里面又有多种不同的产品!而普通工厂方法模式的抽象工厂一般只有一个成员函数,相应的,具体的工厂就只能生产一个单一的产品,适用于产品结构单一的情况!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  抽象工厂模式