`

抽象工厂模式实现不同数据库(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
分享到:
评论

相关推荐

    设计模式--抽象工厂模式实现多数据库连接

    总结起来,抽象工厂模式在实现多数据库连接时,通过提供一个统一的接口来创建不同数据库的对象,使得代码更加模块化,易于维护和扩展。在.NET环境下,利用抽象工厂模式可以轻松地在不同数据库之间切换,满足项目需求...

    抽象工厂访问不同的数据库(反射+缓存)

    标题中的“抽象工厂访问不同的数据库(反射+缓存)”是指在软件设计模式中使用抽象工厂模式来创建和管理数据库连接。抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方法,而无需指定具体类。在这个...

    抽象工厂 SQL 和Access 利用泛型读取表中数据 WCF发布出去

    在这个场景中,"抽象工厂 SQL 和 Access" 指的是利用抽象工厂模式来创建与SQL Server和Microsoft Access数据库交互的对象。这种方式的好处在于,我们可以根据需求切换不同的数据库系统,而不需要修改大量代码,因为...

    三层+抽象工厂(连接Msql数据库和SqlServer2005数据库)

    在连接不同类型的数据库时,如MySQL和SQL Server,抽象工厂可以帮助我们创建适配特定数据库的连接对象,实现解耦和扩展性。 例如,我们可以定义一个抽象接口`DatabaseConnectionFactory`,包含创建数据库连接的方法...

    抽象工厂实现多种数据库访问

    在本例中,我们使用抽象工厂模式来实现对不同数据库(如SQL和Access)的访问。通过这种方式,我们可以灵活地切换数据库类型,而无需更改客户端代码。 首先,定义了一个名为`IFactory`的接口,其中包含一个方法`Get...

    C#工厂模式多数据库(实现SQL和MYSQL的切换)

    通过定义接口和实现具体工厂类,我们可以根据配置信息轻松地在SQL Server和MySQL之间切换,而无需修改业务逻辑代码。这种设计不仅降低了系统的耦合度,还提高了代码的可读性和可维护性,是解决此类问题的一个高效...

    ASP.NET 抽象工厂Demo 数据库链接切换 sql2005和access

    在这个"ASP.NET 抽象工厂Demo 数据库链接切换 sql2005和access"的主题中,我们将深入探讨如何在ASP.NET项目中实现数据库连接的灵活切换,包括使用SQL Server 2005和Access两种不同的数据库系统。 抽象工厂模式是一...

    用工厂模式开发多数据库连接类

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,它的主要目的是为了抽象产品的创建过程,使得客户端可以无须关心具体的产品实现,只需要通过一个公共的接口或者类来获取产品实例。在这个“用工厂模式开发多...

    抽象工厂实现多类型数据库

    本篇文章将深入探讨如何使用C#和ADO.NET通过抽象工厂模式实现对多类型数据库的支持。 首先,抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。在多数据库...

    抽象工厂实现访问多多种数据库

    这种模式在IT行业中广泛应用于数据库访问,因为不同的数据库系统(如Access、SQL Server、Oracle等)有着各自特定的API和连接方式。在本示例中,我们通过抽象工厂来实现对多种数据库的支持,从而实现程序的可扩展性...

    反射+抽象工厂模式的简易实现

    总结起来,"反射+抽象工厂模式的简易实现"是为了在运行时动态适应不同的数据库环境,通过反射实现动态加载和使用适当的数据库连接工厂,同时抽象工厂模式保证了创建数据库连接的代码与使用这些连接的业务逻辑解耦。...

    抽象工厂Factory C# 数据库切换设计模式

    本人做了一个抽象工厂的小案例,只要修改配置文件,就可以轻松的切换数据库,里面附有ACCESS数据库,不需要配置 sql数据库附加上去就好了,修改配置连接 就可以轻松切换 数据库 如有问题请联系qimenglin_aptech@163.com ...

    抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式)

    在实际应用中,抽象工厂模式常用于操作系统、数据库驱动、GUI组件库等场景,因为这些领域往往需要一组相关的产品共同工作。例如,一个GUI库可能需要提供不同平台(如Windows、Linux)下的按钮、窗口等组件,这些组件...

    用C#实现的数据库抽象工厂

    最近,我在学习设计模式后,尝试用C#实现了一个数据库抽象工厂模式。这种模式的实现有助于我们更加灵活地进行数据库操作,同时保持代码的可维护性和可扩展性。在此,我将介绍我的实现思路和过程中的一些细节,希望...

    抽象工厂实现多数据库访问

    通过这种方式,抽象工厂模式不仅实现了数据库访问的解耦,还提高了代码的可扩展性和可维护性。在实际项目中,我们还可以考虑使用依赖注入框架,如Unity或Autofac,将工厂实例的创建过程进一步抽象,以实现更灵活的...

    抽象工厂模式实现代码(利用了反射)

    3. 实现抽象工厂接口的多个具体工厂类,每个工厂类知道如何使用反射创建对应的产品实例。 4. 在运行时,根据配置或条件,动态选择并实例化合适的工厂类。 5. 使用工厂创建的产品进行业务逻辑处理。 这样的设计使...

    c#三层+抽象工厂实现+类似抽象工厂反射实现

    综合以上,这个项目可能是一个使用C#实现的教育管理系统,采用了三层架构设计,其中数据访问层利用了抽象工厂模式,通过反射技术实现了工厂类的动态创建,以适应不同数据库环境的需求。同时,项目还涉及到了数据库...

    设计模式-抽象工厂模式(讲解及其实现代码)

    在实际项目中,例如在开发跨平台的应用程序时,如操作系统、数据库等,不同平台可能需要使用不同的组件,抽象工厂模式就非常适用。通过创建针对不同平台的工厂,可以轻松地切换到不同平台的组件,提高代码的可复用性...

    反射+抽象工厂模式

    然后,每个具体的数据库适配器(如`MySqlAdapter`、`OracleAdapter`)继承自`DatabaseAdapter`,并使用抽象工厂模式的实现来创建数据库连接。 在实际应用中,我们可以通过配置文件或数据库来指定当前使用的数据库...

Global site tag (gtag.js) - Google Analytics