抽象工厂模式实例 更改数据库

1、抽象工厂实现

package gongchangmoshi;

public interface Iuser {
void Insert(User user);
User GetUser(int id);
}
package gongchangmoshi;

public interface IDepartment {
void Insert(Department department);
Department GetDepartment(int id);
}
package gongchangmoshi;

public class Department {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}
package gongchangmoshi;

public class User {
private int id;
private String name;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}

}
package gongchangmoshi;

public class SqlServerUser implements Iuser {

	public void Insert(User user) {
		System.out.println("在SqLServer中插一条用户");
	}

	public User GetUser(int id) {
System.out.println("在sqlserver得到一条用户记录");
return null;
	}

}
package gongchangmoshi;

public class SqlServerDepartment implements IDepartment{

	public void Insert(Department department) {
		System.out.println("在Sqlserve中插入一个部门记录");
		
	}

	public Department GetDepartment(int id) {
		System.out.println("在SqlServer中根据id获取一条部门记录");
		return null;
	}

}
package gongchangmoshi;

public class AccessUser implements Iuser {

	public void Insert(User user) {
	System.out.println("在Access中插入一条用户记录");
	}

	public User GetUser(int id) {
		System.out.println("在Assess中获得一条记录");
		
		return null;
	}

}
package gongchangmoshi;

public class AccessDepartment implements IDepartment{
	public void Insert(Department department) {
		System.out.print("在Access中插入一个部门记录");
		
	}

	public Department GetDepartment(int id) {
		System.out.print("在Access中根据id获取一条部门记录");
		return null;
	}
}
package gongchangmoshi;

public interface IFactory {
Iuser getUser();
IDepartment getDepartment();
}
package gongchangmoshi;

public class AccessFactory implements IFactory {

	public Iuser getUser() {
		return new AccessUser();
	}

	public IDepartment getDepartment() {
	return new AccessDepartment();
	}
	

}
package gongchangmoshi;

public class SqlServerFactory implements IFactory{

	public Iuser getUser() {
		return new SqlServerUser();
	}

	public IDepartment getDepartment() {
		return new AccessDepartment();
	}
	

}

2、简单工厂改造

去掉三个工厂类,加一个静态简单工厂类DataAccess

package jiandanchouxiang;

public class DataAccess {
private static String db="SqlServer";
public static Iuser CreateUser()
{Iuser result=null;
switch(db)
{case "SqlServer":
	result=new SqlServerUser();
	break;
case "Access":
	result=new AccessUser(); 
	break;
	
}
return result;
}

	public static IDepartment CreateDepartment() {
		IDepartment result = null;
		switch (db) {
		case "SqlServer":
			result = new SqlServerDepartment();
			break;
		case "Access":
			result = new AccessDepartment();
			break;

		}
		return result;
	}
}

客户端写法

package jiandanchouxiang;

public class Test {
	public static void main(String args[]) {
		User user = new User();
		Department dept = new Department();
		Iuser iu = DataAccess.CreateUser();
		IDepartment id = DataAccess.CreateDepartment();
		iu.Insert(user);
		iu.GetUser(1);
		id.Insert(dept);
		id.GetDepartment(2);

	}
}

3、用反射改造DataAccess类

进而消除分支

package fanshe;
import java.lang.reflect.*;
public class DataAccess {
	private static String AssemblyName="fanshe";
private static String db="Access";
public static Iuser CreateUser() throws Exception
{String className=AssemblyName+"."+db+"User";
return (Iuser)Class.forName(className).getConstructor(null).newInstance();
}



	public static IDepartment CreateDepartment() throws Exception{
		String className=AssemblyName+"."+db+"Department";
		Object obj=Class.forName(className);
		return (IDepartment)Class.forName(className).getConstructor(null).newInstance();
	}
}

4、用配置文件进行改造

package fanshe;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.*;
import java.util.Properties;


public class DataAccess {
	private static String AssemblyName="fanshe";
private static String db=GetValue("classname");
public static Iuser CreateUser() throws Exception
{String className=AssemblyName+"."+db+"User";
return (Iuser)Class.forName(className).getConstructor(null).newInstance();
	
	
}



	public static IDepartment CreateDepartment() throws Exception{
		
		String className=AssemblyName+"."+db+"Department";
	
		return (IDepartment)Class.forName(className).getConstructor(null).newInstance();
		
	}
	public static String GetValue(String str)
	{Properties pr=new Properties();
	FileReader fr;
	try {
		fr = new FileReader("G:\\gwh\\SheJi2\\src\\claa.txt");
	
	pr.load(fr);
	fr.close();
	}catch(Exception e)
	{e.printStackTrace();
	}
	
	return pr.getProperty(str);
	}
}

配置文件 

classname=Access

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/89467300