抽象工厂的一个范例

转载 2007年10月15日 16:08:00

设计模式中的抽象工厂是这样一种方式:它提供一个接口,以创建多个相关联的对象,而无需具体指定其具体的类。形象地说,它是一个工厂,能够生产众多产品。当用户需要某种产品的时候,不需要去关心这个产品的具体实现,而只需要指定产品的名称,抽象工厂就能够按你的要求进行生产。这里所指的产品,在C#中我们代表的是一个实例的类。

在面向对象的程序设计中,我们经常会定义许多类,并通过new对其进行实例化。一旦类对象较多,且在实例化的时候,要做的初始化工作比较复杂的时候,我们就可以通过抽象工厂来管理。根据对象的性质和内容分别抽象成类,同时定义接口和接口方法。一旦定义了抽象工厂,实例类的工作就交给工厂,使用者只需要告诉工厂,你实例化的对象是什么就行了。

下面我们定义了一个“音像工厂”,工厂的产品有CD和DVD。而且根据audio和Vidio又分别对CD和VCD进行了分类。假设我们把CD和DVD都看成是AVDevice,那么有关CD和DVD的类就可以抽象成一个接口:IAVDevice。这个接口要实现的方法是获得产品的音频和视频。

现在有两个对象CD和DVD,他们又有共同的性质Audio和Video。显然我们应该将CD和DVD定义成类,而将Audio和Video定义为接口。(我们可以将接口看做为同一性质对象的分类。凡是具有相同性质的对象都实现该接口)。因为CD和DVD都属于一种AVDevice,因此它们都实现IAVDevice接口是毫无疑问的。但他们是否也应实现IAudio和IVidio接口呢?答案是肯定的,但是如此定义层次比较混乱,所以最好再为CD和DVD分别定义不同的类对象,来实现这两个接口。最后的定义如下:

public interface IAVDevice
 {     
  IAudio GetAudio();
  IVideo GetVideo();
 }             

 public interface IVideo
 {     
  string GetPictureQuality();
 }

 public interface IAudio
 {     
  string GetSoundQuality();
 }

 class CCd:IAVDevice
 {
  public IAudio GetAudio()
  {
   return new CCdAudio();
  }
  public IVideo GetVideo()
  {
   return new CCdVideo();
  }     
 }

 class CDvd:IAVDevice
 {
  public IAudio GetAudio()
  {
   return new CDvdAudio();
  }
  public IVideo GetVideo()
  {
   return new CDvdVideo();
  }     
 }

 class CCdAudio:IAudio
 {     
  public string GetSoundQuality()
  {
   return "CD Audio is better then DVD Audio";
  }
 }

 class CCdVideo:IVideo
 {
  public string GetPictureQuality()
  {
   return "CD video quality is not as good as DVD";
  }
 }

 class CDvdAudio:IAudio
 {
  public string GetSoundQuality()
  {
   return  "DVD Audio is not as good as CD Audio";
  }     
 }

 class CDvdVideo:IVideo
 {     
  public string GetPictureQuality()
  {
   return "DVD video quality is better then CD";
  }
 }

结构如图:


然后,我们要实现一个机制:就是能够根据用户的要求“生产”出相应的产品,是CD还是DVD?

class CAVMaker
 {     
  public IAVDevice AVMake(string xWhat)
  {
   switch (xWhat.ToLower())
   {
    case "cd":
     return new CCd();
    case "dvd":
     return new CDvd();
    default:
     return new CCd();                     
   }
  }

 }

现在我们可以看它的执行流程:当我们输入”cd”时,CAVMaker就实例CCD类对象。(注意返回的结果类型为IAVDevice)。实际上得到结果相当于执行如下代码:

IAVDevice  objFac = new CCd();

如果我们对objFac分别调用GetAudio()和GetVideo()方法时,又会根据objFac对象的类型(它属于CCd类)实例化CCdAudio和CCdVideo类对象。(注意返回的类型),此时相当于执行如下代码:

IAudio objAudio = new CCdAudio();
IVideo objVideo = new CCdVideo();

此时我们就可以再调用他们各自的方法了。

使用以上接口和类的代码如下:
public class AbstractFactory
 {
  static void Main(string[] args)
  {
   CAVMaker objFactMaker = new CAVMaker();
   IAVDevice objFact;
   IAudio objAudio;
   IVideo objVideo;
   string strWhat;
   strWhat = args[0];
   objFact = objFactMaker.AVMake(strWhat);
   objAudio = objFact.GetAudio();
   objVideo = objFact.GetVideo();
   Console.WriteLine(objAudio.GetSoundQuality());
   Console.WriteLine(objVideo.GetPictureQuality());
  }
 }

执行时,将编译后的EXE文件运行,同时在命令行输入“cd“或“dvd“就可以得到不同的结果。通过这个例子,我们可以对抽象工厂有一个初步的认识。
 

《Head First 设计模式》之抽象工厂模式

《head first》书上举的例子讲的还是Pizza的例子,只不过这次是用的原料来模拟抽象共工厂模式,类太多,感觉还是大话的这个例子更贴近一点,类相对来说也少,更加清晰。大话上的例子说的是利用抽象工...
  • thepeakofmountain
  • thepeakofmountain
  • 2014-07-16 21:46:55
  • 1047

Android源码分析之抽象工厂模式

Android源码之抽象工厂模式 一个对象族或者一组没有任何关系的对象都有相同的约束,都可以使用抽象工厂模式(工厂方法模式是一个具体工厂创建一个类型的对象,抽象工厂模式是一个具体工厂创建一个产品族或...
  • bboyfeiyu
  • bboyfeiyu
  • 2014-04-22 14:51:56
  • 3664

JAVA设计模式之抽象工厂模式

本文属于23种设计模式系列。 继续前面简单工厂模式和工厂方法模式的例子,以汽车配件制造介绍抽象工厂模式。...
  • jason0539
  • jason0539
  • 2015-04-11 08:26:32
  • 58244

一个抽象工厂的例子

最近在学习设计模式,首先在工厂模式中,遇到了抽象工厂模式,所以自己设计了个例子,大概说明了下道理,代码如下:package abstractfactory;abstract  class Make...
  • jackyrongvip
  • jackyrongvip
  • 2005-10-14 08:29:00
  • 494

浅谈Java设计模式——单实例、简单工厂、抽象工厂、观察者

最近的项目里面涉及到一些Java设计模式,在此简单谈一下自己的看法,以下实例一部分参考同行,大部分自己设计。1.单例模式 如果一个类始终只能创建一个实例,则这个类成为单例类,这种设计模式...
  • Princeliu999
  • Princeliu999
  • 2017-08-06 11:46:56
  • 1598

设计模式:浅析 抽象工厂、工厂方法、简单(静态)工厂 java实现

抽象工厂 抽象工厂:多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。 即提供一个创建一系列相关或相互依赖对象的接口...
  • df1012890048
  • df1012890048
  • 2014-08-19 01:24:01
  • 1428

简单工厂、工厂方法与抽象工厂大比拼

简单工厂、工厂方法和抽象工厂都属于设计模式创建型,严格意义上简单工厂不属于23设计模式之一(违背了开闭原则),本文为了完整描述三工厂演变过程,对三工厂进行了整体的总结和学习,并通过三者之间的特点比较总...
  • u010097777
  • u010097777
  • 2015-08-20 18:37:31
  • 1632

简单工厂、工厂模式和抽象工厂

简单工厂模式:这个可谓是
  • tinyway
  • tinyway
  • 2014-07-09 20:03:25
  • 353

抽象工厂模式——发展新的产品方向

时光飞逝,小成的注塑厂在良好的经营管理之下获得了不错的经济效益,但是他们的厂之前都是只做塑料容器产品的生产,现在想发展新的产品方向,做塑料模具。小成想了想新学到的抽象工厂模式,也把代码给改了。介绍  ...
  • totond
  • totond
  • 2016-07-02 16:10:11
  • 866

Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)

模式描述 提供一个用于创建一系列相关或相互依赖对象(产品族)的接口(抽象工厂),而无须指定它们的具体类。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产...
  • ooppookid
  • ooppookid
  • 2015-01-19 16:53:55
  • 1775
收藏助手
不良信息举报
您举报文章:抽象工厂的一个范例
举报原因:
原因补充:

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