工廠模式獲取接口實現類對象

看一個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
相關文章
相關標籤/搜索