`

java反射机制学习(五):工厂模式

    博客分类:
  • Java
阅读更多

1、普通的工厂模式

//定义接口
interface Fruit {
	public void eat();
}

//苹果类
class Apple implements Fruit{
	public void eat(){
		System.out.println("*****吃苹果");
	}
}
//橘子类
class Orange implements Fruit{
	public void eat(){
		System.out.println("******吃橘子");
	}
}
//梨子类
class Pear implements Fruit{
	public void eat(){
		System.out.println("******吃梨");
	}
}
//普通工厂类
class Factory{
	public static Fruit getInstance(String className){
		Fruit fruit = null;
		if("apple".equals(className.toLowerCase())){
			fruit = new Apple();
		}
		if("orange".equals(className.toLowerCase())){
			fruit = new Orange();
		}
		return fruit;
	}
}

//main方法测试
public class FactoryDemo {
	public static void main(String[] args) throws Exception {
		//实例化
		Fruit f = Factory.getInstance("orange");
		f.eat();
	}
}

 普通工厂类存在一个问题:当添加新的fruit子类时需要修改Factory类。因此使用反射来解决这个问题。

2、使用反射的工厂类

//使用反射的工厂类
class FactoryByReflect{
	public  static Fruit getInstance(String className){
		Fruit f = null;
		try{
			f = (Fruit)Class.forName(className).newInstance();
		}catch(Exception e){
			e.printStackTrace();
		}
		return f;
	}
}
//main方法测试
public class FactoryDemo {
	public static void main(String[] args) throws Exception {
		//使用反射进行改进
		Fruit f2 = FactoryByReflect.getInstance("com.wjl.reflect.Pear");
		f2.eat();
	}
}

使用反射机制进行改进后依然存在一个问题:className配置时需要添加过长的包名且不能灵活配置 ,因此考虑使用配置文件的方式进一步改进。

3、使用配置文件的工厂类

先在src下新建一个fruit.properties内容如下:

apple=com.wjl.reflect.Apple
orange=com.wjl.reflect.Orange
pear=com.wjl.reflect.Pear

编写InitProperties类进行读取和测试:

class InitProperties{
	public static Properties getPro(){
		Properties pro = new Properties();
		try{
			//获取src下的properties配置文件
			String filePath = InitProperties.class.getResource("/fruit.properties").getPath();
//			System.out.println("配置文件路径:"+filePath);
			filePath = URLDecoder.decode(filePath,"utf-8");//将路径中的空格(%20)替换成空格
			File file = new File(filePath);
			if(file.exists()){
				pro.load(new FileInputStream(file));
				/*
				//或者使用一下方法直接加载数据
				InputStream in  = InitProperties.class.getClassLoader().getResourceAsStream("fruit.properties");
				pro.load(in);
				*/
			}else{
				pro.setProperty("apple", "com.wjl.reflect.Apple");
				pro.setProperty("orange", "com.wjl.reflect.Orange");
				pro.setProperty("pear", "com.wjl.reflect.Pear");
				pro.store(new FileOutputStream(file),"Fruit class");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return pro;
	}
}
//main方法测试
public class FactoryDemo {
	public static void main(String[] args) throws Exception {
		//使用配置文件
		Properties pro = InitProperties.getPro();
		Fruit f3 = (Fruit) Class.forName(pro.getProperty("apple")).newInstance();
		f3.eat();
	}
}

 

分享到:
评论

相关推荐

    java 反射工厂模式

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

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

    以下是一个简单的例子,展示了如何利用反射优化工厂模式: ```java public class ReflectionFactory { public static Object createInstance(String className) throws Exception { Class<?> clazz = Class.for...

    用反射机制改进的抽象工厂

    用反射机制改进的抽象工厂

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    菜鸟教程设计模式之工厂模式代码整理(反射机制改进版)

    在这个“菜鸟教程设计模式之工厂模式代码整理(反射机制改进版)”中,我们主要探讨的是如何利用Java的反射机制来进一步增强工厂模式的功能。 首先,理解工厂模式的基本概念。工厂模式属于创建型设计模式,它提供了...

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    JAVA反射机制自定义框架测试代码

    Java反射机制是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在构建框架和库时尤为有用。本篇文章将...

    java反射原理详解

    Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...

    java 设计模式之工厂模式

    在软件开发中,设计模式是一种解决...Java反射机制的引入,为工厂模式提供了更大的灵活性,允许在运行时动态地创建和操作对象。理解并掌握这些概念,对于提升Java编程能力,尤其是设计大型、可维护的系统具有重要意义。

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在...通过本章的学习,读者将掌握Java反射机制的核心概念,了解如何在实际项目中运用反射,以及其优缺点。通过实践和练习,进一步巩固反射机制的理解和应用。

    JAVA反射机制

    - 工厂模式:反射可用于动态创建不同类型的对象,避免硬编码类名。 - 单例模式:双重检查锁定单例模式中,反射可能破坏单例的唯一性。 综上所述,JAVA反射机制是JAVA平台上的强大工具,为开发者提供了极大的灵活...

    Java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制的核心在于Java.lang.reflect包,提供了Class、Constructor、Method和Field等类,用于获取类的信息...

    Java反射机制.docx

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类的结构和行为,包括类的属性、方法、构造器等信息,并能在运行时动态地创建对象、调用方法、设置和获取属性值。这一机制使得Java具备了高度的...

    工厂模式代码

    1. **Java反射机制**:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的...

    JAVA反射机制与动态代理综合资料

    总的来说,这份“JAVA反射机制与动态代理综合资料”应该是一个全面的学习资源,涵盖了从基础概念到实际应用的多个方面,对于想要提升Java技能或深入理解J2EE开发的程序员来说,是非常宝贵的学习材料。通过学习和实践...

    工厂模式、简单工厂模式、抽象工厂模式、反射工厂模式

    反射工厂模式利用反射机制,可以在运行时根据条件或配置动态决定创建哪种类型的对象。这种方式更加灵活,但同时也可能带来性能损失,因为反射操作比直接实例化对象要慢。 对比没有使用工厂模式的情况,直接实例化...

    Java 反射机制的实例详解

    Java 反射机制的实例详解 Java 反射机制是 Java 语言中一个非常重要的概念,它允许开发者在运行时检查和修改类的结构和行为。下面是 Java 反射机制的实例详解: 一、Java 反射机制的定义 Java 反射机制是指在运行...

    java反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和实践面向对象编程有着深远的影响,尤其是在动态类型、元数据处理以及框架设计等方面。...

Global site tag (gtag.js) - Google Analytics