将反射用于工厂模式
来源:互联网 发布:人工智能后空翻 编辑:程序博客网 时间:2024/05/21 23:31
/**
* @author Rollen-Holt 设计模式之 工厂模式
*/
interface
fruit{
public
abstract
void
eat();
}
class
Apple
implements
fruit{
public
void
eat(){
System.out.println(
"Apple"
);
}
}
class
Orange
implements
fruit{
public
void
eat(){
System.out.println(
"Orange"
);
}
}
// 构造工厂类
// 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了
class
Factory{
public
static
fruit getInstance(String fruitName){
fruit f=
null
;
if
(
"Apple"
.equals(fruitName)){
f=
new
Apple();
}
if
(
"Orange"
.equals(fruitName)){
f=
new
Orange();
}
return
f;
}
}
class
hello{
public
static
void
main(String[] a){
fruit f=Factory.getInstance(
"Orange"
);
f.eat();
}
}
这样,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
现在我们看看利用反射机制:
package com.rexyn;interface fruit {public abstract void eat();}class Apple implements fruit {public void eat() {System.out.println("Apple");}}class Orange implements fruit {public void eat() {System.out.println("Orange");}}class Factory {public static fruit getInstance(String ClassName) {fruit f = null;try {f = (fruit) Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}class hello {public static void main(String[] a) {fruit f = Factory.getInstance("Reflect.Apple");if (f != null) {f.eat();}}}
现在就算我们添加任意多个子类的时候,工厂类就不需要修改。
上面的爱吗虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
下面我们来看看: 结合属性文件的工厂模式
首先创建一个fruit.properties的资源文件,
内容为:
apple=Reflect.Apple
orange=Reflect.Orange
然后编写主类代码:
package Reflect;import java.io.*;import java.util.*;interface fruit {public abstract void eat();}class Apple implements fruit {public void eat() {System.out.println("Apple");}}class Orange implements fruit {public void eat() {System.out.println("Orange");}} // 操作属性文件类class init{ 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;}}class Factory {public static fruit getInstance(String ClassName) {fruit f = null;try {f = (fruit) Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}class hello {public static void main(String[] a) throws FileNotFoundException,IOException {Properties pro = init.getPro();fruit f = Factory.getInstance(pro.getProperty("apple"));if (f != null) {f.eat();}}}
0 0
- 将反射用于工厂模式
- 将反射用于工厂模式
- 将反射用于工厂模式
- java 反射解析,将反射用于工厂模式【实例】
- 将反射应用在工厂模式上
- 反射工厂模式
- 工厂模式 + 反射改进
- 工厂模式与反射
- 抽象工厂模式+反射
- 反射工厂模式
- 工厂模式中的反射
- 简单工厂模式+反射
- 反射--工厂设计模式
- 利用反射实现工厂模式.
- .Net反射工厂设计模式
- 策略模式+简单工厂+反射
- 简单工厂模式与反射
- java反射实现工厂模式
- VS 提示0xcdcdcdcd的错误
- Yii cookie
- Hbase访问方式之Mapreduce
- java 解析properties文件 工具类 通用
- (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入
- 将反射用于工厂模式
- Oracle Join Methods
- IOS-将长文字转化成图片方法
- [Leetcode] Multiply Strings (Java)
- ROW_NUMBER() OVER函数的基本用法
- Oracle聚合函数RANK和dense_rank的使用
- DLL中调用约定和名称修饰(二)
- Android中动态更新View组件的大小
- HttpClient POST的中文编码问题