工厂模式获取接口实现类对象

看一个Demo,有一个接口UserService,两个实现类UserServiceImpl,UserServiceImpl2java

package cn.demo;

public interface UserService {

	public abstract void findUsers();
}


package cn.demo

public class UserServiceImpl implements UserService {

	@Override
	public void findUsers() {
		System.out.println("查找全部用户...");
	}

}


package cn.demo

public class UserServiceImpl2 implements UserService {

	@Override
	public void findUsers() {
		System.out.println("查找全部用户并排序...");
	}

}

一、普通作法

package cn.demo


public class FactoryTest {

	public static void main(String[] args) {
		UserService userService = new UserServiceImpl();
		// UserService userService = new UserServiceImpl2();
		userService.findUsers();
	}
}

当咱们使用实现类UserServiceImpl时,须要在代码中使用new关键字建立,当咱们想使用实现类UserServiceImpl2时,不得不更改代码,使用new关键字建立UserServiceImpl2的实例。下面看工厂模式的作法ide

二、工厂模式

工厂类code

package cn.demo.utils;

import java.util.ResourceBundle;

public class MyFactoryUtils {

	@SuppressWarnings("all")
	public static <T> T getInstance(Class<T> c) {
		// 获取接口类名
		String interfaceName = c.getSimpleName();

		// 加载配置文件,获取接口实现类的包名.类名 ,ResourceBundle用于读取src目录下的properties文件
		String interfaceImplName = ResourceBundle.getBundle("myinterface").getString(interfaceName);

		// 返回实例对象
		try {
			return (T) Class.forName(interfaceImplName).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e + "加载接口实例失败");
		}
	}

}

同时在src目录下建立myinterface.properties文件,并配置对象

UserService=cn.demo.UserServiceImpl

使用排序

package cn.demo;


public class FactoryTest {

	public static void main(String[] args) {
	        UserService userService = MyFactoryUtils.getInstance(UserService.class);
		userService.findUsers();
	}
}

这样若是想使用另外一个实现类,只须要更改配置文件就能够了接口

UserService=cn.demo.UserServiceImpl2
相关文章
相关标签/搜索