`

抽象工厂模式实现不同数据库(ACCess、SQL)实现用户和部门操作,用反射的方式切换

阅读更多
1.用vs2013建模如果




自动生成代码

用户和部门实体

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public class Department
	{
		public virtual int ID
		{
			get;
			set;
		}

		public virtual string DepartmentName
		{
			get;
			set;
		}

	}
}



//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public class User
	{
		public virtual int ID
		{
			get;
			set;
		}

		public virtual string UserName
		{
			get;
			set;
		}

	}
}




用户操作契约:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public interface IUser 
	{
		void InsertUser(User user);

		User GetUser(int id);

	}
}


部门操作契约(接口)
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public interface IDepartment 
	{
		void InsertDepartment(string departmentName);

		Department GetDepartment(int id);

	}
}




部门ACCESS操作的实现
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public class AccessDepartment : IDepartment
    {
            public void Insert(Department department)
            {
                Console.WriteLine("在Access中给Department表增加一条记录");
            }

            public Department GetDepartment(int id)
            {
                Console.WriteLine("在Access中根据ID得到Department表一条记录");
                return null;
            }

	}
}






用户ACCESS操作实现类

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;


    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表增加一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据ID得到User表一条记录");
            return null;
        }
    }
}




部门SQL操作类实现
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public class SqlserverDepartment : IDepartment
	{
        public void Insert(Department department)
        {
            Console.WriteLine("在Sqlserver中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录");
            return null;
        }

	}
}




用户操作SQL数据实现
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

	public class SqlserverUser : IUser
	{
		public virtual void InsertUser(User user)
		{
			throw new System.NotImplementedException();
		}

		public virtual User GetUser(int id)
		{
			throw new System.NotImplementedException();
		}

	}
}


 



反射方式获得实现

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AbractFactory
{
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Reflection;
    using System.Text;

	public class DataAccess
	{
        private static readonly string AssemblyName = "抽象工厂模式";
        private static readonly string db = ConfigurationManager.AppSettings["DB"];
		public virtual IDepartment IDepartment
		{
			get;
			set;
		}

		public virtual IUser IUser
		{
			get;
			set;
		}

		public virtual void CreateUser()
		{
            string className = AssemblyName + "." + db + "User";
            IUser= (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
		}

		public virtual void  CreateDepartment()
		{
            string className = AssemblyName + "." + db + "Department";
            IDepartment= (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
		}

	}
}





调用

using AbractFactory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesginPatternLib.GeneratedCode
{
    class Class1
    {

        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            DataAccess da = new DataAccess();
            IUser iu = da.IUser;

            iu.InsertUser(user);
            
            iu.GetUser(1);
            IDepartment id = da.IDepartment;
            id.InsertDepartment(dept);
            id.GetDepartment(1);

            Console.Read();
        }
    }
}



意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

适用性:
1.一个系统要独立于它的产品的创建、组合和表示时.
2.一个系统要由多个产品系列中的一个来配置时.
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
  • 大小: 37.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics