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