`
slzfish
  • 浏览: 5441 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

C#抽象工厂模式的几种实现方法及比较

阅读更多

     

    利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护。各种面向对象的程序设计语言都提供了基本相同的机制:比如类、继承、派生、多态等等。但是又有各自的特色,C# 中的反射机制便是一个很重要的工具,好好地利用就可以在实际中发挥很大的作用。

    我们来看一个例子:

    我的程序中有需要一系列的对象,比如apple,orange…, 要想利用他们,我们就必须在程序中根据用户要求,然后一个个调用 new 操作符来生成他们,这样客户程序就要知道相应的类的信息,生成的代码显然不够灵活。我们可以在代码中不利用具体的类,而只是说明我们需要什么,然后就能够得到我们想要的对象吗?

    我们的程序考虑的是对象怎么创建的,创建型模式应该符合要求吧。然后我们浏览一下各模式的“意图”部分。第一个好像就撞到彩了,抽象工厂,我们看看吧,“提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类”,至少“无需指定它们具体的类”符合我们的要求。来看看它的结构吧!

    我们的问题好像用不到这么复杂吧!只有orange,apple等等(应该就是product了),他们显然是一类的,都是fruit,我们只要一个生产水果的工厂就可以,左边的继承层次不要,只有一个FruitFactroy看看行不,先别管它正统不正统,实用就行。

    下面的一些东西显然是我们需要的:

    Public interface IFruit 
    { 
    } 
    public class Orange:IFruit 
    { 
      public Orange() 
      { 
    Console.WriteLine("An orange is got!"); 
      } 
    } 
    public class Apple:IFruit 
    { 
      public Apple() 
      { 
    Console.WriteLine("An apple is got!"); 
      } 
    }

    我们的FruitFactory应该是怎么样呢?上面的结构图中它给的是CreateProductA,那好,我就MakeOrange,还有一个CreateProductB,俺MakeOrange还不行??

    public class FruitFactory 
    { 
      public Orange MakeOrange() 
      { 
    return new Orange(); 
      } 
      public Apple MakeApple() 
      { 
    return new Apple(); 
      } 
    }

    怎么使用这个工厂呢?我们来写下面的代码:

    string FruitName = Console.ReadLine(); 
    IFruit MyFruit = null; 
    FruitFactory MyFruitFactory = new FruitFactory(); 
    switch (FruitName) 
    { 
      case "Orange": 
    MyFruit = MyFruitFactory.MakeOrange(); 
    break; 
      case "Apple": 
    MyFruit = MyFruitFactory.MakeApple(); 
    break; 
      default: 
    break; 
    }

    编译运行,然后在控制台输入想要的东西,成功。不过等等,它好像还不完美,我如果想要pear,我既要在客户代码中的switch中加入判断,又要在工厂方法中加入MakePear方法,好像不怎么优雅。更好一点,在工厂中只提供一个方法,MakeFruit,然后传递进一个参数Name,代表我们想要的水果的名称,这样的话,似乎我们的客户代码中的那个switch就可以不要了,相反,在FruitFactory中好像需要一个,还等什么呢?实现吧!

    FruitFactory: 
    public class FruitFactory 
    { 
      public IFruit MakeFruit(string Name) 
      { 
    switch (Name) 
    { 
      case "Orange": 
    return new Orange(); 
      case "Apple": 
    return new Apple(); 
      default: 
    return null; 
    } 
      } 
    }

    客户代码:

    string FruitName = Console.ReadLine(); 
    IFruit MyFruit; 
    FruitFactory MyFruitFactory = new FruitFactory(); 
    MyFruit = MyFruitFactory.MakeFruit(FruitName);

    这样看起来好多了,至少我客户代码中不要再写那么一长串的判断代码了。
    既然不要条件判断,传入的只有水果的名称,假如Name = “Apple”,要生成一个Apple的对象,我需要new Apple(),如果我能够这样多好: new MakeItToClass(Name),把字符串转换成一个类。C#中虽然没有上述语法,但是提供了相应的机制,那就是反射。其中一个重要的类就是System.Type类,它对于反射起着核心的作用。我们可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。
    另外一个重要的类就是System.Activator,它包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。
    我们可以先利用Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用Activator创建对象。

    public class FruitFactory 
    { 
      public IFruit MakeFruit(string Name) 
      { 
    IFruit MyFruit = null; 
    try 
    { 
      Type type = Type.GetType(Name,true); 
      MyFruit = (IFruit)Activator.CreateInstance(type); 
    } 
    catch (TypeLoadException e) 
      Console.WriteLine("I dont know this kind of fruit,exception caught - {0}" ,e.Message); 
      return MyFruit; 
      } 
    }
分享到:
评论

相关推荐

    c#几种常用的设计模式

    c#几种常用的设计模式,包括单例模式、监视着模式、工厂方法模式和抽象工厂模式

    c#简单工厂、工厂方法与抽象工厂的区别分析

    有一个比较好理解的例子,在这跟大家介绍下: 1.如果一个后花园只种蔬菜类,那么就用简单工厂...抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品. 具体例子: 1.简单工厂

    C#设计模式.PDF

    四、 在什么情形下使用抽象工厂模式: 44 五、 抽象工厂的起源 45 六、 Abstract Factory模式在实际系统中的实现 46 七、 "开放-封闭"原则 50 C#设计模式(7)-Singleton Pattern 50 一、 单例(Singleton)模式 ...

    C#设计模式大全

    四、 在什么情形下使用抽象工厂模式: 五、 抽象工厂的起源 六、 Abstract Factory模式在实际系统中的实现 七、 "开放-封闭"原则 C#设计模式(7)-Singleton Pattern 一、 单例(Singleton)模式 二、 ...

    C#23种设计模式_示例源代码及PDF

    工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...

    几种常见设计模式案例及类图

    这是几种常见设计模式案例及其对应的类图,包括工厂方法模式,抽象工厂模式,单利模式等,用C#编写。

    C#设计模式.rar

    C# 几种 设计模式Demo 以及优缺点注释 主要有 1单例模式 2简单工厂 3抽象工厂 4委托的另外一种写法 5...

    二十三种设计模式【PDF版】

    设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    领域驱动设计与模式实战

    第1章 应重视的价值,也是对过去几年的沉重反思 1.1 总体价值 1.2 应重视的架构风格 1.2.1 焦点之一:模型 1.2.2 焦点之二:用例 1.2.3 如果重视模型,就可以使用领域模型模式 1.2.4 慎重处理数据库 1.2.5 领域模型...

    DesignPatterns:设计模式实践

    这些可以分为以下几种类型: 坚硬的 S-单一责任负责人 O-开-关本金 L -Liskov换人校长 I-接口隔离主体 D-依赖倒置 设计模式的类型 1)创造力 与对象的创建相关联。 建造者 工厂工厂 抽象工厂 工厂方法 原型 ...

    Spring.net框架

    为了消除MainApp对其它组件的依赖性,我们引入工厂模式,并且根据配置文件指定的装配规程,利用.net提供的反射技术完成对象的组装工作。 本部分代码仅仅提供一种功能演示,如果实际应用仍需进一步完善(建议使用一些...

    亮剑.NET深入体验与实战精要2

    14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面...

    亮剑.NET深入体验与实战精要3

    14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面...

Global site tag (gtag.js) - Google Analytics