IFactory接口,定义一个创建访问User表的抽象的工厂接口
nterface IFactory
{
IUser CreateUser();
IDepartment CreateDepartment();//增加接口的方法
}
SqlServerFactory类,实现IFactory接口,实例化SqlserverUser
class SqlServerFactory :IFactory
{
public IUser CreateUser() {
return new SqlserverUser();
}
public IDepartment CreateDepartment()
{
return new SqlserverDepartment();
}
}
AccessFactory类,实现IFactory接口,实例化AccessUser
class AccessFactory:IFactory
{
public IUser CreateUser() {
return new AccessUser();
}
public IDepartment CreateDepartment()
{
return new AccessDepartment();
}
}
IUser接口,用于客户端访问,解除与具体数据库访问的耦合
interface IUser
{
void Insert(User user);
User GetUser(int id);
}
SqlserverUser类,用于访问SQL Server的User
class SqlserverUser :IUser
{
public void Insert(User user) {
Console.WriteLine("在SQL Server中给User表增加一条信息");
}
public User GetUser(int id) {
Console.WriteLine("在SQL Server中根据Id得到User表中的一条记录");
return null;
}
}
AccessUser类,,用于访问Access的User
class AccessUser:IUser
{
public void Insert(User user)
{
Console.WriteLine("在Access中给User表增加一条信息");
}
public User GetUser(int id)
{
Console.WriteLine("在Access中根据Id得到User表中的一条记录");
return null;
}
}
User类:
class User
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
private int _name;
public int Name
{
get { return _name; }
set { _name = value; }
}
}
以上利用抽象工厂创建了一个用户的接口,分别可以访问access数据库和sql server数据库,这样利用情形可以利用工厂方法可以结局,创建一个用户的工厂,抽象的工厂的用处在哪里呢?现在来了一个department,也要求可以访问两个数据库,那么怎么做呢?这时利用抽象工厂再创建一个department接口:
department类:
class Department
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
private string _department;
public string Department1
{
get { return _department; }
set { _department = value; }
}
}
department接口:
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
sqlServeDepartment类,用于访问SQL Server的Department
class SqlserverDepartment : IDepartment
{
public void Insert(Department department) {
Console.WriteLine("在SQL Server中给Department表增加一条记录");
}
public Department GetDepartment(int id) {
Console.WriteLine("在SQL Server中根据ID得到deparment表中一条记录");
return null;
}
}
AccessDepartment类,用于访问Access的Department
class AccessDepartment :IDepartment
{
public void Insert(Department department)
{
Console.WriteLine("在Access中给Department表添加一条记录");
}
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据id得到department表一条记录");
return null;
}
}
客户端调用:
static void Main(string[] args)
{
User user = new User();
Department dept = new Department();
IFactory factory = new SqlServerFactory();
IUser iu = factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);
IDepartment id = factory.CreateDepartment();
id.Insert(dept);
id.GetDepartment(1);
Console.Read();
}
运行结果:
理解抽象工厂:
我们再次看看抽象工厂的定义,提供一个创建一系列相关或相互依赖对象的接口,在这个例子,指的是用户(User)和部门(Department)两个接口: IUser CreateUser(); IDepartment CreateDepartment(); 没有指定具体的哪个用户或者哪个部门的对象.这就是抽象工厂的精髓所在.