工厂接口:提供创建对象的接口。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory.InterfaceProvide
{
public interface IFactory
{
IUserInfo CreateUser();
IDepartment CreateDepartment();
}
}
实例接口:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory.InterfaceProvide
{
public interface IDepartment
{
void GetEntity(int id);
void Insert(Model.Department model);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory.InterfaceProvide
{
public interface IUserInfo
{
void GetEntity(int id);
void Insert(Model.UserInfo model);
}
}
抽象工厂类:通过反射创建对应的不同的工厂。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using AbstractFactory.InterfaceProvide;
using System.Xml;
namespace AbstractFactory.Fac
{
public class DataAccess : IFactory
{
//public string db = "SqlServer";
public static string db = GetDB();
public static string GetDB()
{
XmlDocument doc = new XmlDocument();
string dir = AppDomain.CurrentDomain.BaseDirectory.Replace("\\bin\\Debug", "");
doc.Load(dir + "App.xml");
XmlElement xe = doc.DocumentElement;
string val = xe.ChildNodes[0].InnerText;
return val;
}
public static IFactory CreateFac()
{
return (IFactory)Assembly.Load("AbstractFactory").CreateInstance("AbstractFactory.Fac." + db + "Factory");
}
//public IUserInfo CreateUser()
//{
// return (IUserInfo)Assembly.Load("AbstractFactory").CreateInstance("AbstractFactory.DAL." + db + "." + db + "UserInfo");
//}
//public IDepartment CreateDepartment()
//{
// return (IDepartment)Assembly.Load("AbstractFactory").CreateInstance("AbstractFactory.DAL." + db + "." + db + "Department");
//}
}
}
Access工厂:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AbstractFactory.InterfaceProvide;
using AbstractFactory.DAL;
using AbstractFactory.DAL.Access;
namespace AbstractFactory.Fac
{
public class AccessFactory : IFactory
{
public IUserInfo CreateUser()
{
return new AccessUserInfo();
}
public IDepartment CreateDepartment()
{
return new AccessDepartment();
}
}
}
SqlServer工厂:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AbstractFactory.InterfaceProvide;
namespace AbstractFactory.Fac
{
public class SqlServerFactory : IFactory
{
public IUserInfo CreateUser()
{
return new DAL.SqlServer.SqlServerUserInfo();
}
public IDepartment CreateDepartment()
{
return new DAL.SqlServer.SqlServerDepartment();
}
}
}
通过加载配置文件,选择初始化哪个工厂。
<?xml version="1.0" encoding="utf-8" ?>
<DataBase>
<Type>SqlServer</Type>
</DataBase>
要实例的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AbstractFactory.InterfaceProvide;
namespace AbstractFactory.DAL.Access
{
public class AccessDepartment : IDepartment
{
public void GetEntity(int id)
{
Console.WriteLine("在Access中的Department表获得一个实体!!!");
}
public void Insert(Model.Department model)
{
Console.WriteLine("在Access中的Department表添加一个实体!!!");
}
}
public class AccessUserInfo : IUserInfo
{
public void GetEntity(int id)
{
Console.WriteLine("在Access中的UserInfo表获得一个实体!!!");
}
public void Insert(Model.UserInfo model)
{
Console.WriteLine("在Access中的UserInfo表添加一个实体!!!");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AbstractFactory.InterfaceProvide;
using AbstractFactory.Model;
namespace AbstractFactory.DAL.SqlServer
{
public class SqlServerDepartment : IDepartment
{
public void Insert(Department user)
{
Console.WriteLine("在Sqlserver中的Department表添加一个实体!!!");
}
public void GetEntity(int id)
{
Console.WriteLine("在Sqlserver中的Department表获得一个实体!!!");
}
}
public class SqlServerUserInfo : IUserInfo
{
public void Insert(UserInfo user)
{
Console.WriteLine("在Sqlserver中的UserInfo表添加一个实体!!!");
}
public void GetEntity(int id)
{
Console.WriteLine("在Sqlserver中的UserInfo表获得一个实体!!!");
}
}
}
Model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactory.Model
{
public class UserInfo
{
private string _UserName;
public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}
private int _Age;
public int Age
{
get { return _Age; }
set { _Age = value; }
}
}
public class Department
{
public string Name { get; set; }
}
}
使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AbstractFactory.DAL.Access;
using AbstractFactory.DAL.SqlServer;
using AbstractFactory.Fac;
using AbstractFactory.InterfaceProvide;
namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//DataAccess da = new DataAccess();
//IUserInfo sqlUser = da.CreateUser();
//sqlUser.Insert(null);
//sqlUser.GetEntity(1);
IFactory fac = DataAccess.CreateFac();
IUserInfo userInfo = fac.CreateUser();
userInfo.GetEntity(1);
Console.ReadLine();
//AccessUserInfo AccessFac = new AccessFactory().CreateUser() as AccessUserInfo;
//AccessFac.Insert(null);
//AccessFac.GetEntity(1);
//Console.ReadLine();
}
}
}
人家写的非常详细:
http://www.cnblogs.com/Terrylee/category/36516.html