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

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();
	}
	

}
package gongchangmoshi;

public class Test {
	public static void main(String args[]) {
		User user = new User();
		Department dept = new Department();
		IFactory factory = new AccessFactory();
		Iuser iu = factory.getUser();
		iu.Insert(user);
		iu.GetUser(1);
		IDepartment id = new AccessDepartment();
		id.Insert(dept);
		id.GetDepartment(2);

	}
}

 

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

把配置文件改成XML文件再来一次

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


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class DataAccess {
	private static String AssemblyName="fanshe2";
private static String db=GetValue("add");
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) {
		String s="";
		try
			// 创建解析器工厂
			{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = factory.newDocumentBuilder();
			// 创建一个Document对象
			Document doc = db.parse("src/fanshe2/al.xml");
		NodeList node=doc.getElementsByTagName(str);
		Element element=(Element)node.item(0);
		s= element.getAttribute("classname");
		
			
			}catch(Exception e)
			{e.printStackTrace();
			}
			
return s;
}
}

XML文件写法:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<add  classname="SqlServer"/>

</configuration>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值