Java学习笔记----工厂模式和反射
来源:互联网 发布:德奥关系 知乎 编辑:程序博客网 时间:2024/06/07 02:26
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>
<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中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。
好,那我们用反射来解决上面提到的问题
class
FruitFactory{
public
static
fruit getInstance(String ClassName){
F
ruit fruit=
null
;
try
{
fruit=(Fruit)Class.forName(ClassName).newInstance();
}
catch
(Exception e) {
e.printStackTrace();
}
return
fruit;
}
}
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
会在后续的文章中运用- Java学习笔记----工厂模式和反射
- Java反射和工厂模式
- java工厂模式和抽象工厂模式学习笔记
- java 反射和 工厂模式结合使用
- Java学习笔记-工厂模式
- Java中工厂、配置文件和反射学习
- Java中工厂、配置文件和反射学习
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- java设计模式学习笔记-工厂模式
- java设计模式-工厂模式学习笔记
- 设计模式学习笔记六:.NET反射工厂
- 学习反射机制 - 工厂模式
- java反射实现工厂模式
- java反射应用于工厂模式
- Java 反射与工厂模式
- Java 反射之工厂模式
- 学习笔记-轻量级Java EE:模式--工厂方法和抽象工厂
- java学习笔记--工厂模式、实体关系
- 2010年山东省第一届ACM大学生程序设计竞赛:shopping
- 欢迎使用CSDN-markdown编辑器
- LeetCode 13 Roman to Integer
- Android客户端实现注册/登录详解(一)
- eclipse 的team中没有svn设置
- Java学习笔记----工厂模式和反射
- CCF 集合竞价
- 安全智能:信息安全领域中的大数据分析
- netstat命令详解
- utf8mb4解决四字节字符保存到mysql不报错的问题
- hibernate优化(二):缓存
- 简要对比下HTTP-DNS调度和302跳转调度之间的区别
- angularjs自定义过滤器demo
- Struts理解