设计模式之抽象工厂模式(可用于项目实战)

来源:互联网 发布:java命令运行jar包 编辑:程序博客网 时间:2024/06/07 03:46

1、举例:

有两个表:User表,Department表,使用抽象工厂模式完成项目的开发,该项目数据库可能是SqlServer或者Oracle,可以很方便的进行数据库移植

(1)首先新建一个Entity文件夹,里面存储反应数据库中表的业务实体类

/// <summary>
/// User表
/// </summary>
public class User
{
       public int Id { get; set; }
       public string Name { get; set; }
       public string Sex { get; set; }
       public int Age { get; set; }
}
/// <summary>
/// 部门表
/// </summary>
public class Department
{
       public int Id { get; set; }
       public string DepartName { get; set; }
}
(2)新建一个Interface文件夹,里面存储接口,包括对业务实体进行操作的接口
/// <summary>
/// 用户表的操作接口(与操作的数据库解耦)
/// </summary>
public interface IUser
{
        void Insert(User user);
        void Delete(int id);
        void Update(User user);
        User GetUserById(int id);
        List<User> GetUsers();
}
/// <summary>
/// 部门操作接口(与操作的数据库解耦)
/// </summary>
public interface IDepartment
{
       void Insert(Department department);
       void Delete(int id);
       void Update(Department department);
       Department GetDepartmentById(int id);
       List<Department> GetDepartments();
}
(3)创建两个文件夹Oracle和SqlServer,里面存储使用不同数据库操作业务实体的数据访问,继承业务实体操作接口
例如:SqlServer文件夹(Oracle一样)
/// <summary>
/// 使用SqlServe数据库操作User表
/// </summary>
public class SqlServerUser:IUser
{
        public void Insert(User user)
        {
              Console.WriteLine("使用Sql Server数据库新增一条User记录");
        }
        public void Delete(int id)
        {
             Console.WriteLine("使用Sql Server数据库删除Id为{0}的一条User记录",id);
        }
        public void Update(User user)
        {
             Console.WriteLine("使用Sql Server数据库更新Id为{0}的一条User记录",user.Id);
        }
       public User GetUserById(int id)
       {
             Console.WriteLine("使用Sql Server数据库获取Id为{0}的一条User记录",id);
             return new User();
       }
      public List<User> GetUsers()
      {
            Console.WriteLine("使用Sql Server数据库获取User记录");
            return new List<User>();
      }
}
/// <summary>
/// 使用SqlServe数据库操作Department表
/// </summary>
public class SqlServerDepartment:IDepartment
{
       public void Insert(Department department)
       {
             Console.WriteLine("使用Sql Server数据库新增一条Department记录");
       }
       public void Delete(int id)
       {
            Console.WriteLine("使用Sql Server数据库删除Id为{0}的一条Department记录", id);
       }
      public void Update(Department department)
      {
            Console.WriteLine("使用Sql Server数据库更新Id为{0}的一条Department记录", department.Id);
      }
      public Department GetDepartmentById(int id)
      {
            Console.WriteLine("使用Sql Server数据库获取Id为{0}的一条Department记录", id);
            return new Department();
     }
      public List<Department> GetDepartments()
      {
           Console.WriteLine("使用Sql Server数据库获取department记录");
           return new List<Department>();
      }
}
(4)为了方便用户使用,创建Ifactory接口,放在Inteface文件夹中
/// <summary>
/// 抽象工厂类
/// </summary>
public interface IFactory
{
           IUser CreateUserOpt();
           IDepartment CreateDepartmentOpt();
}
(5)新建一个Factory文件夹,创建Oracle和SqlServer工厂,返回不同的对象
/// <summary>
/// Oracle工厂类
/// </summary>
public class OracleFactory:IFactory
{
          public IUser CreateUserOpt()
          {
                  return new OracleUser();
           }
          public IDepartment CreateDepartmentOpt()
          {
               return new OracleDepartment();
          }
}
/// <summary>
/// SqlServer工厂类
/// </summary>
public class SqlServerFactory:IFactory
{
         public IUser CreateUserOpt()
         {
                 return new SqlServerUser();
          }
          public IDepartment CreateDepartmentOpt()
         {
               return new SqlServerDepartment();
          }
}
(6)客户端调用
DevelopModel.IFactory_table.IFactory factory = newDevelopModel.IFactory_table.OracleFactory();
DevelopModel.IFactory_table.IUser userOpt= factory.CreateUserOpt();
DevelopModel.IFactory_table.IDepartment departmentOpt = factory.CreateDepartmentOpt();

userOpt.Insert(new DevelopModel.IFactory_table.User());
userOpt.Delete(1);
userOpt.Update(new DevelopModel.IFactory_table.User());
userOpt.GetUserById(7);
userOpt.GetUsers();

departmentOpt.Insert(new DevelopModel.IFactory_table.Department());
departmentOpt.Delete(1);
departmentOpt.Update(new DevelopModel.IFactory_table.Department());
departmentOpt.GetDepartmentById(7);
departmentOpt.GetDepartments();

如果把数据库移植到SqlServer上,只需要更改红色部分的工厂类为SqlServerFactory即可

0 0