抽象工厂+反射

工厂接口:提供创建对象的接口。

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

原文地址:https://www.cnblogs.com/xsj1989/p/5280088.html