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

我们来看一个例子:

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

哦,我们都看设计模式,听吧,很多人都在那里鼓吹他们是如何如何的棒,我们看看怎么样利用他们来解决问题。目标明确了,那我们看看哪个能够符合我们的要 求。GoF的《设计模式》都看过吧,似懂非懂的看了一些,那我们看看能够不能够“凑”上去呢?J 嗯,我们的程序考虑的是对象怎么创建的,创建型模式应该符合要求吧。然后我们浏览一下各模式的“意图”部分。呵呵,第一个好像就撞到彩了,抽象工厂,我们 看看吧,“提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类”,至少“无需指定它们具体的类”符合我们的要求。来看看它的结构吧:

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

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

Code
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还不行??

Code
public class FruitFactory 

public Orange MakeOrange() 

return new Orange(); 

public Apple MakeApple() 

return new Apple(); 

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

Code
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中好像需要一个,还等什么呢?实现吧。

Code
 1 FruitFactory: 
 2 public class FruitFactory 
 3 { 
 4 public IFruit MakeFruit(string Name) 
 5 { 
 6 switch (Name) 
 7 { 
 8 case "Orange": 
 9 return new Orange(); 
10 case "Apple": 
11 return new Apple(); 
12 default: 
13 return null; 
14 } 
15 } 
16 } 
17 

客户代码:

1 string FruitName = Console.ReadLine(); 
2 IFruit MyFruit; 
3 FruitFactory MyFruitFactory = new FruitFactory(); 
4 MyFruit = MyFruitFactory.MakeFruit(FruitName); 

这样看起来好多了,至少我客户代码中不要再写那么一长串的判断代码了。

阿Q精神又在起作用,我们又沉浸在成功的喜悦中了。 嗯,代码好像可以,应该没有什么改进了。但是好像又有另外一个声音在说:

“除了一点……”

“嗯? 等等,什么?”

“FruitFactory也有switch啊,看起来也ugly啊!”

“哼,肯定是看《重构》或者是《TDD》了,怎么要求那么苛刻!反正闲着也是闲着,看看可以改不?”

既然不要条件判断,传入的只有水果的名称,假如Name = “Apple”,要生成一个Apple的对象,我需要new Apple(),如果我能够这样多好: new MakeItToClass(Name),把字符串转换成一个类。C#中虽然没有上述语法,但是提供了相应的机制,那就是反射。其中一个重要的类就是 System.Type类,它对于反射起着核心的作用。我们可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。

另外一个重要的类就是System.Activator,它包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。

我们可以先利用Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用Activator创建对象。还等什么呢?

Code
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; 

}

经过这样的处理以后,增加新的水果的时候,我们不需要修改客户代码了,同时工厂的代码也不需要修改了,怎么样,爽吧!

转载于:https://www.cnblogs.com/xianspace/archive/2009/03/01/1400821.html

C# 工厂模式 简单入门相关推荐

  1. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

  2. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

    园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...

  3. 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

    一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...

  4. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...

  5. java 抽象工厂模式简单实例

    抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生. 类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易.包含有 ...

  6. 工厂模式,简单工厂模式,抽象工厂模式三者有什么区别

    工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面 ...

  7. JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  8. 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  9. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

最新文章

  1. Android ANR异常及解决方法
  2. NSOprationQueue 与 GCD 的区别与选用
  3. 用计算机计算器课程,信息技术学科“神奇的计算器”教学设计
  4. (*长期更新)软考网络工程师学习笔记——Section 18 计算机硬件基本知识
  5. wiremock 使用_使用WireMock进行更好的集成测试
  6. nrf52832芯片手册_nRF52832低功耗问题不完全总结
  7. 腾讯三面:40亿个QQ号码如何去重?
  8. NGINX基于Tomcat配置负载均衡
  9. 蓝湖完成 10 亿元 C+ 轮融资,发布一站式产品设计协作工具
  10. 找不到文件或程序集名称“DreamweaverCtrls”的解决方法
  11. HBuilder Android APP打包发布
  12. mpass小程序开发总结
  13. 美国NIST《可解释的人工智能的四个原则》(全文翻译)
  14. Ubuntu下的“千千静听”-Audacious
  15. Android 播放器 mov,Android 调用系统播放器
  16. 关于报错connection holder is null
  17. 共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称
  18. 50家大厂面试万字精华总结,面试的时候突然遇到答不上的问题怎么办?分享一点面试小经验
  19. 2022-渗透测试-xss小游戏通关
  20. 每日一问-ChapGPT-20221231-关于中医的各国看法

热门文章

  1. 对DataSet,DataRow,DateTable转换成相应的模型
  2. topcoder srm 495 div1
  3. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)
  4. 致青春VS杜蕾斯,用QQ空间电影大数据解读关联性
  5. 生活中的算法---公交换乘
  6. 黑马lavarel教程---7、文件上传
  7. TypeScript基础学习 —— 基础类型
  8. 20172311-哈夫曼编码测试
  9. 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)
  10. websocket在.net4.5中实现的简单demo