`
micheal19840929
  • 浏览: 166326 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

反射在设计模式中的应用

    博客分类:
  • J2SE
阅读更多

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

   我们来看一个例子:

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

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

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

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

 

 

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

 

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

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

“除了一点……”

“嗯? 等等,什么?”

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

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

 

 既然不要条件判断,传入的只有水果的名称,假如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; 
  } 
} 

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

 转自:http://noriko529784.blog.163.com/blog/static/30429996200782403832721/

补充,以下是我用java实现的反射工厂模式

package com;

public class Factory<T> {
	
	@SuppressWarnings("unchecked")
	public T create(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		T t=null;
		t=(T)Class.forName(className).newInstance();
		return t;
	}
}

 

package com;

public class MyFactory extends Factory<Product> {
	
	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
	{
		MyFactory myFactory=new MyFactory();
		Product p=myFactory.create("com.Product");
		p.hello();
	}

}

 

 

package com;

public class Product {
	public void hello(){
		System.out.println("hello");
	}
}

 

打印:hello

 

分享到:
评论

相关推荐

    C#反射、委托技术在设计模式中的应用

    【C#反射、委托技术在设计模式中的应用】 在C#编程中,反射和委托是两种强大的特性,它们在设计模式中发挥着至关重要的作用。本文将深入探讨这两种技术及其在设计模式中的应用场景。 首先,让我们理解什么是反射。...

    JAVA设计模式--程序设计--反射--注解--泛型

    Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...

    java 反射技术 设计模式 spring security 安全管理手册

    这种能力在设计模式、框架开发以及元数据驱动的应用中尤其有用。 设计模式是软件工程中的一种最佳实践,是解决常见问题的模板。在Java中,常见的设计模式包括工厂模式、单例模式、装饰器模式、代理模式、观察者模式...

    Java设计模式刘伟书本中模拟考试答案

    在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...

    论.NET反射、委托技术与设计模式关系

    总之,反射、委托和设计模式在.NET框架中扮演着重要角色,它们提供了丰富的编程能力和解决方案。理解并熟练运用这些概念,可以帮助开发者编写出更加灵活、可扩展和可维护的代码。通过结合反射的动态性、委托的回调...

    Java设计模式深入研究

    设计模式是一套被重复使用的代码设计...全书共分12章,首先强调了接口和抽象类在设计模式中的重要性,介绍了反射技术在设计模式中的应用。然后,从常用的23个设计模式中精选了10个进行了详细的讲解,包括2个创建……

    设计模式 工厂 反射 log4net

    这可能是为了演示如何在实际项目中应用这些设计模式和工具,帮助开发者理解它们的工作原理以及如何在实践中进行集成。通过学习和研究这些案例,开发者可以加深对工厂模式、反射和log4net的理解,提高自己的编程技能...

    java设计模式案例

    例如,在.NET框架中,反射和委托等技术可以简化一些设计模式的实现。因此,学习设计模式时,要结合实际使用的编程语言和开发平台,了解其对设计模式支持的程度。 需求驱动是选择和应用设计模式的关键。只有当设计...

    java 反射工厂模式

    反射机制允许我们在运行时动态地获取类的信息并操作对象,而工厂模式是一种设计模式,它提供了一种创建对象的最佳方式,使得代码更加灵活且易于维护。 **Java反射** Java反射API提供了一种在运行时检查类、接口、...

    C__.NET_反射、委托技术与设计模式

    设计模式是在软件设计过程中总结出的最佳实践,反射技术在某些设计模式中扮演着关键角色。例如,在工厂模式中,反射可以用于根据运行时提供的字符串动态创建对象;在策略模式中,反射可以用来动态地替换算法;在装饰...

    基于Java的XML解析与反射设计模式.pdf

    在软件开发中,XML解析与反射设计模式是两个非常重要的概念。随着计算机时代的蓬勃发展,Internet的普及给社会以及人民的生活带来了巨大的影响。同时,B/S结构的多系统相互访问技术也如雨后春笋般不断涌现出来,相应...

    软件架构建模设计模式

    阅读和分析已有的开源项目,理解其中的设计模式应用,是提升设计模式应用能力的有效途径。同时,不断地反思和总结自己的代码,尝试优化并引入适合的设计模式,也是提升软件架构能力的重要步骤。 总之,"软件架构...

    设计模式-工厂方法模式

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...

    采用六层架构+抽象工厂设计模式+反射机制搭建CRM项目框架

    在IT行业中,构建高效、可扩展的软件系统是至关重要的,而"采用六层架构+抽象工厂设计模式+反射机制搭建CRM项目框架"正是这样的一个技术实践。这种框架设计能够帮助开发者实现模块化的代码结构,增强系统的灵活性...

    .NET反射、委托技术与设计模式

    在.NET中,反射和委托可以应用于多种设计模式,如: 1. **工厂模式**:利用反射,可以在运行时动态决定创建哪个类的实例,增加了代码的灵活性。 2. **策略模式**:通过委托,可以动态地选择并执行不同的策略(方法...

    反射简单工厂模式工厂模式

    在编程领域,设计模式是解决常见问题的模板,它们提供了可...在实际编程中,可以根据需求选择合适的设计模式,使代码更加优雅和易于维护。通过分析提供的文件名,我们可以期待在这些代码示例中找到这些概念的实际应用。

    设计模式java

    在本文中,将会介绍一些在Java中常用的设计模式,并结合Java的特性加以讨论。 首先,设计模式通常被分为三大类:创建型设计模式、结构型设计模式和行为型设计模式。创建型模式主要用于对象的创建,比如单例模式、...

    工厂设计模式代码

    在工厂设计模式中,UML通常用于绘制类图、序列图和状态图等,以清晰地展示类之间的关系、对象的交互以及行为流程。例如,类图会显示工厂类与产品类之间的继承和关联关系,序列图则描绘出对象间的交互顺序。 在Java...

    利用java反射原理实现工厂模式

    在Java编程中,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式通过定义一个工厂接口以及其实现类来创建特定类型的对象,然而,这种模式在面对需求变化时可能显得不够灵活。...

    C++ Qt设计模式(第2版)

    C++ Qt设计模式(第2版)是美国萨福克大学已使用十余年的经典教程,利用跨平台开源软件开发框架Qt阐释了C++和设计模式中的主要思想。全书共分四个部分:第一部分介绍C++、UML、Qt、模型-视图、SQL、XML、设计模式等...

Global site tag (gtag.js) - Google Analytics