设计模式(2)- 抽象工厂(Abstract Factory)

原创 2006年05月30日 09:57:00

描述:
     抽象工厂是一个适用于创建一系列相关的产品的创建性模型.比如设计模式书中经常讲的那个例子-支持多视感窗口的工具包,比如windows和motif风格,这个是风格族.每种风格下面都有些标准的产品族,象BUTTON, TextBox, ListBox等.试想一下,如果直接在client中指定具体产品和它的风格,那么会出现2*3 = 6中组合,如果新增一种产品或风格,那么组合会以倍数增加,看来这样的做法是很愚蠢的.所以还是以面向对象的几个原则来分析一下这个问题,首先可以看出此问题有两个方面的变化,一个是窗口风格的变化,另一个是产品的变化.而且在程序中一般都会出现相同风格的产品,windows风格的应用程序绝对不会出现一个motif风格的按钮.上面的两点足以说明,客户端只需要指定一个风格,然后创建时就自然的创建出这个风格的产品族来了.而每种产品应该有个一致的接口,不会因为风格的不同接口也不同.所以客户端得到的产品不管是什么风格的都会一致的对待.


静态结构图:

这个模式的好处:
增加一个产品,只需增加一个抽象产品类和各个风格的这个产品的具体类.而对别的没有影响.
增加一个风格,首先要增加一个具体工厂类,然后在每个产品中增加一个支持这个风格的具体产品类.
松散了client直接创建产品带来的耦合性,和复杂性(因为直接创建产品将会得到乘积数量的产品).

什么时候使用:
一个系统要独立于它的产品的创建,组合和使用时.
一个系统有一系列产品,而每个产品都有不同的实现(风格),而在一个具体的应用中只能配置一种实现时(风格).

例子:
麦当劳和肯德基都是做快餐的,假如你现在你要做一个这样的企业的MIS系统,你必须让这个系统通用,而且这样的公司都有一系列的相关产品所以你会考虑用抽象工厂来创建产品系列(象汉堡,可乐等),其中公司就是风格族,做的那些食品就是产品族.而且在一个应用中只有同一个风格的产品出现.不会出现肯德基的瓶子里装的是麦当劳的可乐.下面是示意代码:

// Abstract Factory
class FoodFactory
{
 virtual Homburg* CreateHomburg() = 0;
    virtual Kele* CreateKele() = 0;
}

// Concrete Factory
class KFCFactory : public FoodFactory
{
    Homburg* CreateHomburg()
 {
  cout << "use KFC factory create Homburg" << endl;
  return  new KFCHomburg;
 }

    Kele* CreateKele()
 {
  cout << "use KFC factory create Kele" << endl;
  return  new KFCKele;
 }
}

// Concrete Factory
class MDLFactory : public FoodFactory
{
    Homburg* CreateHomburg()
 {
  cout << "use MDL factory create Homburg" << endl;
  return  new MDLHomburg;
 }

    Kele* CreateKele()
 {
  cout << "use MDL factory create Kele" << endl;
  return  new MDLKele;
 }
}

// abstract Homburg
class Homburg
{
 virtual int  GetFlavour() = 0;
 virtual void DrawMe() = 0;
}

// Concrete Homburg
class KFCHomburg : public Homburg
{
 virtual int  GetFlavour()
 {
  cout << "KFC Homburg very good!" << endl;
  return 80;
 }
   
 virtual void DrawMe()
 {
  cout << "KFC Homburg drawing" << endl;
 }
}

// Concrete Homburg
class MDLHomburg : public Homburg
{
 virtual int  GetFlavour()
 {
  cout << "MDL Homburg better!" << endl;
  return 90;
 }
   
 virtual void DrawMe()
 {
  cout << "MDL Homburg drawing" << endl;
 }
}

//Abstract Kele
class Kele
{
 virtual void AddIce() = 0 ;
 virtual DrawMe() = 0;
}

// Concrete Kele
class KFCKele : public Kele
{
 virtual void AddIce()
 {
  cout << "KFC Kele Add Ice" << endl;
 }
 virtual DrawMe()
 {
  cout << "KFC Kele drawing" << endl;
 }
}

// Concrete Kele
class MDLKele : public Kele
{
 virtual void AddIce()
 {
  cout << "MDL Kele Add Ice" << endl;
 }
 virtual DrawMe()
 {
  cout << "MDL Kele drawing" << endl;
 }
}

int main(int argc, char* argv[])
{
    FoodFactory* foodFactory = new  KFCFactory;
    Homburg* homb =  foodFactory->CreateHomburg();
    Kele*  kele = foodFactory->CreateKele();
    cout << homb->GetFlavour()<< endl;
    homb->DrawMe();
    kele->AddIce();
    kele->DrawMe();
    return 0;
}

相关别的模式:
前面说过的工厂方法和抽象工厂的区别是什么,各适用于什么场景中.
如果有一系列产品族则用抽象工厂,如果只有一种类型的产品则用工厂方法.

参考文献:
《设计模式精解》清华大学出版社,熊杰译。
《设计模式可复用面向对象软件的基础》机械工业出版社,四人团著。

设计模式——抽象工厂模式(Abstract Factory)

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 抽象设计模式概念:         针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设...
  • u012909091
  • u012909091
  • 2014年08月02日 16:52
  • 3598

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月29日 02:25
  • 1726

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11621

C#设计模式---抽象工厂(Abstract Factory)

意图          提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。   场景          还是上次说的那个网络游戏,定下来是一个休闲的FPS游戏。和CS差不...
  • zhengluanfeng1985
  • zhengluanfeng1985
  • 2017年03月16日 21:58
  • 120

设计模式:(2)抽象工厂(Abstract Factory)

在分享抽象工厂模式前,我想还是将设计模式的分类图贴上,以便查看整体分布情况,防止思路混乱。 从设计模式分类图中可以看到抽象工厂模式是经典的创建型设计模式之一。也可以看到抽象工厂模式是对象型创...
  • zhulichao3
  • zhulichao3
  • 2016年06月10日 09:25
  • 196

设计模式 抽象工厂 Abstract Factory

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。 抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。它与工厂方法模式的区别就在于,工厂方法模式针对的是一...
  • haitaolang
  • haitaolang
  • 2017年06月03日 12:51
  • 87

Abstract Factory 抽象工厂设计模式

 简单工厂模式虽然实现了使对象的创建与使用进行分离,但一次只能创建一个对象。它不能实现一次创建一系列相互依赖对象的需求,为此我们需要学习抽象工厂模式。抽象工厂:主要功能是生产抽象产品;        ...
  • tly0512
  • tly0512
  • 2009年11月27日 14:14
  • 237

设计模式:抽象工厂-abstract factory

提供一个创建一系列相关或者相互依赖对象的接口,而无须指定他们具体的类优点: 良好的封装性:每个产品类与高层之间的关系不需要被client知道,client只需要知道工厂类能够创建出一个需要的对象即可 ...
  • hjd199464
  • hjd199464
  • 2017年01月11日 10:23
  • 153

设计模式-抽象工厂(Abstract Factory)

应用场景: 1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。 2、系统中有多于一个的产品族,而每次只使用其中某一产品族。 3、属于同一个产...
  • zdongfuyu
  • zdongfuyu
  • 2015年07月21日 17:03
  • 228

设计模式——(Abstract Factory)抽象工厂

设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须设计相关类,并设计类的接口和继承之间的关系。设计必须可以解决当前问题,同时必须对将来可能发生的问题和需求也有足够的针对性。掌握面向...
  • dyllove98
  • dyllove98
  • 2013年07月18日 20:00
  • 678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式(2)- 抽象工厂(Abstract Factory)
举报原因:
原因补充:

(最多只允许输入30个字)