Java学习笔记----工厂模式和反射
2016-04-06 19:52
447 查看
C#课上老师讲的工厂模式和反射,做了些笔记,课下自己结合JAVA,再复习一次工厂模式还有反射。
工厂模式,顾名思义,工厂是负责生产产品的。我们把代码分成两大块,一块是工厂,一块是客户。
客户发布需求,工厂生产对象,满足客户需求,比如我写个工厂:
<span style="font-size:18px;">class IFruit{
}
class apple extends IFruit{
public apple(){
System.out.println("I am Apple");
}
}
class grape <span style="font-family: Arial, Helvetica, sans-serif;">extends IFruit</span>{
public grape(){
System.out.println("I am grape");
}
}
class FruitFactory{
public apple MakeApple(){
return new apple;
}
public grape MakeGrape(){
return new grape;
}
}</span>客户要用的时候:
先实例化一个FruitFactory
FruitFactory MyFruitFactory=new FruitFactory();
客户需要哪种水果,工厂就给客户哪种水果(前提是要工长有)
YieldFruit fruit=null;
switch(FruitName){
case "apple":
fruit=MyFruitFactory.MakeApple();
break;
case "grape":
fruit=MyFruitFactory.MakeGrape();
break;
}
那么问题来了,如果客户又需要一个pear
如果采用原有方法,那么
既需要在客户代码中的switch中加入判断,又要在工厂方法中加入MakePear方法,
代码的重用性非常差,耦合度高
因此客户希望不需要switch,我只传递一个想要的水果的名称,就返回该对象
解决途径:
在工厂中只提供一个方法,MakeFruit,然后传递进一个参数Name,代表客户想要的水果的名称,这样的话,似乎客户代码中的那个switch就可以不要了,相反,在FruitFactory中好像需要一个
<span style="font-size:18px;">public class FruitFactory { </span>
这时候就要用到反射了
何谓反射?
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。
好,那我们用反射来解决上面提到的问题
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
会在后续的文章中运用
工厂模式,顾名思义,工厂是负责生产产品的。我们把代码分成两大块,一块是工厂,一块是客户。
客户发布需求,工厂生产对象,满足客户需求,比如我写个工厂:
<span style="font-size:18px;">class IFruit{
}
class apple extends IFruit{
public apple(){
System.out.println("I am Apple");
}
}
class grape <span style="font-family: Arial, Helvetica, sans-serif;">extends IFruit</span>{
public grape(){
System.out.println("I am grape");
}
}
class FruitFactory{
public apple MakeApple(){
return new apple;
}
public grape MakeGrape(){
return new grape;
}
}</span>客户要用的时候:
先实例化一个FruitFactory
FruitFactory MyFruitFactory=new FruitFactory();
客户需要哪种水果,工厂就给客户哪种水果(前提是要工长有)
YieldFruit fruit=null;
switch(FruitName){
case "apple":
fruit=MyFruitFactory.MakeApple();
break;
case "grape":
fruit=MyFruitFactory.MakeGrape();
break;
}
那么问题来了,如果客户又需要一个pear
如果采用原有方法,那么
既需要在客户代码中的switch中加入判断,又要在工厂方法中加入MakePear方法,
代码的重用性非常差,耦合度高
因此客户希望不需要switch,我只传递一个想要的水果的名称,就返回该对象
解决途径:
在工厂中只提供一个方法,MakeFruit,然后传递进一个参数Name,代表客户想要的水果的名称,这样的话,似乎客户代码中的那个switch就可以不要了,相反,在FruitFactory中好像需要一个
<span style="font-size:18px;">public class FruitFactory { </span>
<span style="font-size:18px;">public IFruit MakeFruit(string Name) <span style="font-family: Arial, Helvetica, sans-serif;">{ </span></span>
<span style="font-size:18px;"> switch (Name) <span style="font-family: Arial, Helvetica, sans-serif;">{ </span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> case "Grape": return new Grape(); </span></span>
<span style="font-size:18px;"> case "Apple": return new Apple(); </span>
<span style="font-size:18px;"> default: return null; } </span>
<span style="font-size:18px;"> }</span>
<span style="font-size:18px;"> }</span>
<span style="font-size:18px;"> </span>
<span style="font-size:18px;">这时候,客户只需要实例化一个FruitFactory对象,然后调动他的MakeFruit方法(把<span style="font-family: Arial, Helvetica, sans-serif;">string Name参数传进去),就能得到相应的水果对象。</span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> </span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">优点:客户代码中不要再写那么一长串的判断代码了。 缺点:FruitFactory也有switch啊,所以一旦需求变化,FruitFactory也要变化 工厂希望:既然不要条件判断,传入的只有水果的名称,假如Name = “Apple”,要生成一个Apple的对象,我需要new Apple(),如果我能够这样多好: new MakeItToClass(Name),把字符串转换成一个类 </span></span>
这时候就要用到反射了
何谓反射?
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。
好,那我们用反射来解决上面提到的问题
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
会在后续的文章中运用
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树