JavaSE020_反射应用之工厂模式
来源:互联网 发布:php地图定位源代码 编辑:程序博客网 时间:2024/06/05 03:02
一、没有使用反射机制的工厂模式
package com.cctvjiatao.Reflect;public interface Fruit {public abstract void eat();}
package com.cctvjiatao.Reflect;class Apple implements Fruit{@Overridepublic void eat() {System.out.println("Apple");}}class Orange implements Fruit{@Overridepublic void eat() {System.out.println("Orange");}}
package com.cctvjiatao.Reflect;/** * 构造工厂类,以后如果我们在添加其他的实例的时候只需要修改工厂类就行了 */public class Factory{public static Fruit getInstance(String fruitName){Fruit fruit = null;if("Apple".equals(fruitName)){fruit = new Apple();}if("Orange".equals(fruitName)){fruit = new Orange();}return fruit;}}
package com.cctvjiatao.Reflect;/** * 测试类 * @author keletao */public class Hello {public static void main(String[] args) {Fruit fruit = Factory.getInstance("Orange");fruit.eat();}}【运行结果】:Orange
这样,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
二、使用了反射机制的工厂模式
package com.cctvjiatao.Reflect;public interface Fruit {public abstract void eat();}
package com.cctvjiatao.Reflect;class Apple implements Fruit{@Overridepublic void eat() {System.out.println("Apple");}}class Orange implements Fruit{@Overridepublic void eat() {System.out.println("Orange");}}
package com.cctvjiatao.Reflect;/** * 构造工厂类,现在就算我们添加任意多个子类的时候,工厂类就不需要修改 */public class Factory{public static Fruit getInstance(String ClassName){Fruit fruit = null;try {fruit = (Fruit) Class.forName(ClassName).newInstance();} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {e.printStackTrace();}return fruit;}}
package com.cctvjiatao.Reflect;/** * 测试类 * @author keletao */public class Hello {public static void main(String[] args) {Fruit fruit = Factory.getInstance("com.cctvjiatao.Reflect.Orange");if(fruit != null){fruit.eat();}}}【运行结果】:Orange
现在就算我们添加任意多个子类的时候,工厂类就不需要修改。
三、反射机制+属性文件的工厂模式
上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
下面我们来看看: 结合属性文件的工厂模式
首先创建一个Fruit.properties的资源文件:
apple=Reflect.Appleorange=Reflect.Orange主类代码:
package com.cctvjiatao.Reflect;class Apple implements Fruit{@Overridepublic void eat() {System.out.println("Apple");}}class Orange implements Fruit{@Overridepublic void eat() {System.out.println("Orange");}}
package com.cctvjiatao.Reflect;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;/** * 操作属性文件类 * @author keletao */public class InitPro {public static Properties getPro() throws FileNotFoundException, IOException {Properties pro = new Properties();File f = new File("Fruit.properties");if (f.exists()) {pro.load(new FileInputStream(f));} else {pro.setProperty("apple", "Reflect.Apple");pro.setProperty("orange", "Reflect.Orange");pro.store(new FileOutputStream(f), "FRUIT CLASS");}return pro;}}
package com.cctvjiatao.Reflect;/** * 构造工厂类 */public class Factory{public static Fruit getInstance(String ClassName){Fruit fruit = null;try {fruit = (Fruit) Class.forName(ClassName).newInstance();} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {e.printStackTrace();}return fruit;}}
package com.cctvjiatao.Reflect;import java.io.IOException;import java.util.Properties;/** * 测试类 * @author keletao */public class Hello {public static void main(String[] args) {try {Properties pro=InitPro.getPro();Fruit fruit = Factory.getInstance(pro.getProperty("apple"));if(fruit != null){fruit.eat();}} catch (IOException e) {e.printStackTrace();}}}【运行结果】:Apple
0 0
- JavaSE020_反射应用之工厂模式
- Java 反射之工厂模式
- Java反射的工厂模式应用
- java反射机制工厂模式的应用
- 将反射应用在工厂模式上
- 设计模式之反射+抽象工厂模式
- 设计模式之工厂模式与反射
- 简单工厂模式、工厂模式、抽象工厂模式 与反射技术应用
- 【设计模式】工厂模式结合反射技术的简单应用
- C# 反射在工厂设计模式中的应用
- 浅析Command模式,反射工厂在系统中的应用
- [转]反射在工厂模式上的应用
- 反射技术在工厂设计模式中的应用
- 【Java高级】反射+工厂模式+属性文件的实例应用
- Java反射机制在工厂模式中的应用
- java反射机制在工厂模式中的应用
- 动态代理及反射在工厂模式上的应用
- Java设计模式之工厂模式(利用反射实现)
- Javascript 如何修改CSS样式(网页样式) 补充说明
- 关于memcached
- VC6.0中如何修改工程的名字
- 跟我学习dubbo-消息中间件在分布式系统中的作用介绍(8)
- 1029. 旧键盘(20)
- JavaSE020_反射应用之工厂模式
- vijos P1131 最小公倍数和最大公约数问题 题解
- block_device_operations
- 多进程,多线程,协程
- CSS简介
- 网络编程(基础)
- block全面分析
- java.lang.OutOfMemoryError : Java heap space
- CSSearchableItemAttributeSet