zoukankan      html  css  js  c++  java
  • C#学习笔记-抽象工厂模式

    题目1:数据访问,通过数据库对用户表单的进行访问,数据库包含SQL Server,对用户表单进行“新增用户”和“查询用户”信息等操作。

    分析:

      首先,确认用户表单,里面包含两个ID和Name两个字段,两种字段可以读写功能;

      单独准备一个数据库的类,然后直接对用户直接进行操作即可。

    实现:

     1 using System;
     2 
     3 namespace 抽象工厂模式
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             //向su数据库中添加user这个新的用户
    10             User user = new User();
    11             // bug:不能更换数据库的原因是su这个数据库已经被框死在了SQL Server上
    12             SqlserverUser su = new SqlserverUser();
    13             su.Insert(user);
    14 
    15             //在su的数据库中查找unknownUser这个用户
    16             User unknownUser = new User();
    17             unknownUser = su.GetUser(5);
    18 
    19             Console.Read();
    20         }
    21     }
    22 
    23     /// <summary>
    24     /// 用户类
    25     /// 准备ID和Name两个字段
    26     /// </summary>
    27     class User
    28     {
    29         private int _id;
    30         private string _name;
    31 
    32         public int Id
    33         {
    34             get { return _id; }
    35             set { _id = value; }
    36         }
    37         public string Name
    38         {
    39             get { return _name; }
    40             set { _name = value; }
    41         }
    42     }
    43 
    44     /// <summary>
    45     /// 用于操作User表
    46     /// “增加用户”和“得到用户”两种方法
    47     /// </summary>
    48     class SqlserverUser
    49     {
    50         /// <summary>
    51         /// 增加用户信息
    52         /// </summary>
    53         /// <param name="user">新的用户信息</param>
    54         public void Insert(User user)
    55         {
    56             Console.WriteLine("在SQL server中给User增加一条记录");
    57         }
    58         /// <summary>
    59         /// 得到用户方法
    60         /// </summary>
    61         /// <param name="id">(传入信息)通过用户的id值</param>
    62         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
    63         public User GetUser(int id)
    64         {
    65             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
    66             return null;
    67         }
    68     }
    69 }
    View Code

    题目2:在1的基础上,我们增加新的数据库Access,同样对刚才的数据库进行访问。

    分析:

      基于1的基础上,SqlserverUser su = new SqlserverUser();将数据库的对象定死在了SQL Server上了,这就出现了很大的局限性。

      为了将SQL与Access灵活使用,我们就需要用到工厂方法模式来封装数据库,让子类决定实例化哪一个类。

    实现:

      1 using System;
      2 
      3 namespace 抽象工厂模式2
      4 {
      5     class Program
      6     {
      7         static void Main(string[] args)
      8         {
      9             //向iu数据库中添加user这个新的用户
     10             User user = new User();
     11             IFactory factory = new SqlServerFactory();  //若要更改成Access数据库 将SqlServerFactory换成AccessFactory即可
     12             IUser iu = factory.CreateUser();
     13             iu.Insert(user);
     14 
     15             //在iu的数据库中查找unknownUser这个用户
     16             User unknownUser = new User();
     17             unknownUser = iu.GetUser(5);
     18 
     19             Console.Read();
     20         }
     21     }
     22 
     23     /// <summary>
     24     /// 用户类
     25     /// 准备ID和Name两个字段
     26     /// </summary>
     27     class User
     28     {
     29         private int _id;
     30         private string _name;
     31 
     32         public int Id
     33         {
     34             get { return _id; }
     35             set { _id = value; }
     36         }
     37         public string Name
     38         {
     39             get { return _name; }
     40             set { _name = value; }
     41         }
     42     }
     43 
     44 
     45     interface IUser
     46     {
     47         void Insert(User user);
     48         User GetUser(int id);
     49     }
     50         
     51     /// <summary>
     52     /// 用于访问SQL Server的User
     53     /// “增加用户”和“得到用户”两种方法
     54     /// </summary>
     55     class SqlserverUser:IUser
     56     {
     57         /// <summary>
     58         /// 增加用户信息
     59         /// </summary>
     60         /// <param name="user">新的用户信息</param>
     61         public void Insert(User user)
     62         {
     63             Console.WriteLine("在SQL server中给User增加一条记录");
     64         }
     65         /// <summary>
     66         /// 得到用户方法
     67         /// </summary>
     68         /// <param name="id">(传入信息)通过用户的id值</param>
     69         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
     70         public User GetUser(int id)
     71         {
     72             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
     73             return null;
     74         }
     75     }
     76     /// <summary>
     77     /// 用户访问Access的User
     78     /// </summary>
     79     class AccessUser : IUser
     80     {
     81         public User GetUser(int id)
     82         {
     83             Console.WriteLine("在Access中根据ID得到User表一条记录");
     84             return null;
     85         }
     86 
     87         public void Insert(User user)
     88         {
     89             Console.WriteLine("在Access中给User增加一条记录");
     90         }
     91     }
     92     /// <summary>
     93     /// 接口
     94     /// 定义了一个创建访问User表对象的抽象的工厂接口
     95     /// </summary>
     96     interface IFactory
     97     {
     98         //因为sql和access都继承于IUser,所以返回值设定为IUser即可
     99         IUser CreateUser();
    100     }
    101     /// <summary>
    102     /// 实现IFactory接口,实例化SqlserverUser
    103     /// </summary>
    104     class SqlServerFactory : IFactory
    105     {
    106         public IUser CreateUser()
    107         {
    108             return new SqlserverUser();
    109         }
    110     }
    111     /// <summary>
    112     /// 实现IFactory接口,实例化AccessUser
    113     /// </summary>
    114     class AccessFactory : IFactory
    115     {
    116         public IUser CreateUser()
    117         {
    118             return new AccessUser();
    119         }
    120     }
    121 }
    View Code

    题目3:在2是我基础上,我们再增加一个信息表,例如Department表来记录信息。

    分析:

      这里Department与User是一样信息,所以和Department的构造与User类似,再同时修改工厂类及其子类信息即可。

      这里需要使用的就是抽象工厂模式(Abstract Factory),提供一个 创建一系列相关或者互相依赖对象的接口,而无需指定他们具体的类。

    实现:

      1 using System;
      2 
      3 namespace 抽象工厂模式3
      4 {
      5     class Program
      6     {
      7         static void Main(string[] args)
      8         {
      9             //向iu数据库中添加user这个新的用户
     10             User user = new User();
     11             IFactory factory = new AccessFactory();  
     12             IUser iu = factory.CreateUser();
     13             iu.Insert(user);
     14 
     15             //在iu的数据库中查找unknownUser这个用户
     16             User unknownUser = new User();
     17             unknownUser = iu.GetUser(5);
     18 
     19             //向id数据库中添加dept这个新的用户
     20             Department dept = new Department();
     21             IDepartment id = factory.CreateDepartment();
     22             id.Insert(dept);
     23 
     24             //在id的数据库中查找unknownDept这个用户
     25             Department unknownDept = new Department();
     26             unknownDept = id.GetDepartment(3);
     27 
     28             Console.Read();
     29         }
     30     }
     31 
     32 
     33     /// <summary>
     34     /// 用户类
     35     /// 准备ID和Name两个字段
     36     /// </summary>
     37     class User
     38     {
     39         private int _id;
     40         private string _name;
     41 
     42         public int Id
     43         {
     44             get { return _id; }
     45             set { _id = value; }
     46         }
     47         public string Name
     48         {
     49             get { return _name; }
     50             set { _name = value; }
     51         }
     52     }
     53     /// <summary>
     54     /// 增加一个Department表
     55     /// </summary>
     56     class Department
     57     {
     58         private int _id;
     59         private string _deptName;
     60 
     61         public int Id
     62         {
     63             get { return _id; }
     64             set { _id = value; }
     65         }
     66 
     67         public string DeptName
     68         {
     69             get { return _deptName; }
     70             set { _deptName = value; }
     71         }
     72     }
     73 
     74 
     75 
     76     interface IUser
     77     {
     78         void Insert(User user);
     79         User GetUser(int id);
     80     }
     81 
     82     /// <summary>
     83     /// 用于访问SQL Server的User
     84     /// “增加用户”和“得到用户”两种方法
     85     /// </summary>
     86     class SqlserverUser : IUser
     87     {
     88         /// <summary>
     89         /// 增加用户信息
     90         /// </summary>
     91         /// <param name="user">新的用户信息</param>
     92         public void Insert(User user)
     93         {
     94             Console.WriteLine("在SQL server中给User增加一条记录");
     95         }
     96         /// <summary>
     97         /// 得到用户方法
     98         /// </summary>
     99         /// <param name="id">(传入信息)通过用户的id值</param>
    100         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
    101         public User GetUser(int id)
    102         {
    103             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
    104             return null;
    105         }
    106     }
    107     /// <summary>
    108     /// 用户访问Access的User
    109     /// </summary>
    110     class AccessUser : IUser
    111     {
    112         public User GetUser(int id)
    113         {
    114             Console.WriteLine("在Access中根据ID得到User表一条记录");
    115             return null;
    116         }
    117 
    118         public void Insert(User user)
    119         {
    120             Console.WriteLine("在Access中给User增加一条记录");
    121         }
    122     }
    123 
    124 
    125 
    126     /// <summary>
    127     /// 与User表一致
    128     /// </summary>
    129     interface IDepartment
    130     {
    131         void Insert(Department department);
    132         Department GetDepartment(int id);
    133     }
    134     class SqlserverDepartment : IDepartment
    135     {
    136         public Department GetDepartment(int id)
    137         {
    138             Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
    139             return null;
    140         }
    141 
    142         public void Insert(Department department)
    143         {
    144             Console.WriteLine("在SQL server中给Department增加一条记录");
    145         }
    146     }
    147     class AccessDepartment : IDepartment
    148     {
    149         public Department GetDepartment(int id)
    150         {
    151             Console.WriteLine("在Access中根据ID得到Department表一条记录");
    152             return null;
    153         }
    154 
    155         public void Insert(Department department)
    156         {
    157             Console.WriteLine("在Access中给Department增加一条记录");
    158         }
    159 
    160     }
    161 
    162 
    163 
    164     
    165     /// <summary>
    166     /// 接口
    167     /// 定义了一个创建访问User表对象的抽象的工厂接口
    168     /// </summary>
    169     interface IFactory
    170     {
    171         //因为sql和access都继承于IUser,所以返回值设定为IUser即可
    172         IUser CreateUser();
    173         IDepartment CreateDepartment();
    174     }
    175     /// <summary>
    176     /// 实现IFactory接口,实例化SqlserverUser
    177     /// </summary>
    178     class SqlServerFactory : IFactory
    179     {
    180         public IDepartment CreateDepartment()
    181         {
    182             return new SqlserverDepartment();
    183         }
    184 
    185         public IUser CreateUser()
    186         {
    187             return new SqlserverUser();
    188         }
    189 
    190     }
    191     /// <summary>
    192     /// 实现IFactory接口,实例化AccessUser
    193     /// </summary>
    194     class AccessFactory : IFactory
    195     {
    196         public IDepartment CreateDepartment()
    197         {
    198             return new AccessDepartment();
    199         }
    200 
    201         public IUser CreateUser()
    202         {
    203             return new AccessUser();
    204         }
    205     }
    206 }
    View Code

    题目4:在3中我们可以得知,如果增加一个信息表Project,就意味着需要增加信息表本身的三个类:IProject、SqlserverProject、AccessProject,同时还需要更改Ifactory、SqlserverFactory和AccessFactory才可以完全实现,那么如果我有100个调用数据库访问的类,工作量将变得巨大。

    分析:

      信息表本身的类是无法删减的,所以我们只有从工厂类来入手,我们将IFactory、SqlserverFactory和AccessFactory三个工厂类去除,用一个DataAccess类来代替,简化代码。

    实现:

      1 using System;
      2 
      3 namespace 抽象工厂模式4
      4 {
      5     class Program
      6     {
      7         static void Main(string[] args)
      8         {
      9             //向iu数据库中添加user这个新的用户
     10             User user = new User();
     11             IUser iu = DataAccess.CreateUser();     //直接得到实际的数据库访问实例,不存在任何依赖
     12             iu.Insert(user);
     13 
     14             //在iu的数据库中查找unknownUser这个用户
     15             User unknownUser = new User();
     16             unknownUser = iu.GetUser(5);
     17 
     18             //向id数据库中添加dept这个新的用户
     19             Department dept = new Department();
     20             IDepartment id = DataAccess.CreateDepartment();
     21             id.Insert(dept);
     22 
     23             //在id的数据库中查找unknownDept这个用户
     24             Department unknownDept = new Department();
     25             unknownDept = id.GetDepartment(3);
     26 
     27             Console.Read();
     28         }
     29     }
     30 
     31 
     32     /// <summary>
     33     /// 用户类
     34     /// 准备ID和Name两个字段
     35     /// </summary>
     36     class User
     37     {
     38         private int _id;
     39         private string _name;
     40 
     41         public int Id
     42         {
     43             get { return _id; }
     44             set { _id = value; }
     45         }
     46         public string Name
     47         {
     48             get { return _name; }
     49             set { _name = value; }
     50         }
     51     }
     52     /// <summary>
     53     /// 增加一个Department表
     54     /// </summary>
     55     class Department
     56     {
     57         private int _id;
     58         private string _deptName;
     59 
     60         public int Id
     61         {
     62             get { return _id; }
     63             set { _id = value; }
     64         }
     65 
     66         public string DeptName
     67         {
     68             get { return _deptName; }
     69             set { _deptName = value; }
     70         }
     71     }
     72 
     73 
     74 
     75     interface IUser
     76     {
     77         void Insert(User user);
     78         User GetUser(int id);
     79     }
     80 
     81     /// <summary>
     82     /// 用于访问SQL Server的User
     83     /// “增加用户”和“得到用户”两种方法
     84     /// </summary>
     85     class SqlserverUser : IUser
     86     {
     87         /// <summary>
     88         /// 增加用户信息
     89         /// </summary>
     90         /// <param name="user">新的用户信息</param>
     91         public void Insert(User user)
     92         {
     93             Console.WriteLine("在SQL server中给User增加一条记录");
     94         }
     95         /// <summary>
     96         /// 得到用户方法
     97         /// </summary>
     98         /// <param name="id">(传入信息)通过用户的id值</param>
     99         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
    100         public User GetUser(int id)
    101         {
    102             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
    103             return null;
    104         }
    105     }
    106     /// <summary>
    107     /// 用户访问Access的User
    108     /// </summary>
    109     class AccessUser : IUser
    110     {
    111         public User GetUser(int id)
    112         {
    113             Console.WriteLine("在Access中根据ID得到User表一条记录");
    114             return null;
    115         }
    116 
    117         public void Insert(User user)
    118         {
    119             Console.WriteLine("在Access中给User增加一条记录");
    120         }
    121     }
    122 
    123 
    124 
    125     /// <summary>
    126     /// 与User表一致
    127     /// </summary>
    128     interface IDepartment
    129     {
    130         void Insert(Department department);
    131         Department GetDepartment(int id);
    132     }
    133     class SqlserverDepartment : IDepartment
    134     {
    135         public Department GetDepartment(int id)
    136         {
    137             Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
    138             return null;
    139         }
    140 
    141         public void Insert(Department department)
    142         {
    143             Console.WriteLine("在SQL server中给Department增加一条记录");
    144         }
    145     }
    146     class AccessDepartment : IDepartment
    147     {
    148         public Department GetDepartment(int id)
    149         {
    150             Console.WriteLine("在Access中根据ID得到Department表一条记录");
    151             return null;
    152         }
    153 
    154         public void Insert(Department department)
    155         {
    156             Console.WriteLine("在Access中给Department增加一条记录");
    157         }
    158 
    159     }
    160 
    161 
    162     class DataAccess
    163     {
    164         //在此确定需要使用的数据库信息
    165         private static readonly string db = "Sqlserver";
    166         //private static readonly string db = "Access";
    167         public static IUser CreateUser()
    168         {
    169             IUser result = null;
    170             switch (db)
    171             {
    172                 case "Sqlserver":
    173                     result = new SqlserverUser();
    174                     break;
    175                 case "Access":
    176                     result = new AccessUser();
    177                     break;
    178             }
    179             return result;
    180         }
    181         public static IDepartment CreateDepartment()
    182         {
    183             IDepartment result = null;
    184             switch (db)
    185             {
    186                 case "Sqlserver":
    187                     result = new SqlserverDepartment();
    188                     break;
    189                 case "Access":
    190                     result = new AccessDepartment();
    191                     break;
    192             }
    193             return result;
    194         }
    195     }
    196 }
    View Code

    题目5:从4中我们可以看出简单工厂的方法就不需要输入参数,这样在客户端就只需要db的值,客户端没有出现任何一个SQL或者Access的字样,达到了解耦的目的,但是同时的问题也出现了,如果我增加了数据库,例如Oracle的数据库访问,那么就需要在DataAccess类中每个方法的switch中加case。

    分析:

      在实例化的过程中我们不难发现:如果是Sqlserver就会去实例化SQL Server数据库相关类,如果是Access就去实例化Access相关类,对应的数据库类可以通过字符串得出来,所以我们可以用到“反射”这种方法:Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")

    实现:

      1 using System;
      2 using System.Reflection;//反射
      3 
      4 namespace 抽象工厂模式5
      5 {
      6     class Program
      7     {
      8         static void Main(string[] args)
      9         {
     10             //向iu数据库中添加user这个新的用户
     11             User user = new User();
     12             IUser iu = DataAccess.CreateUser();     //直接得到实际的数据库访问实例,不存在任何依赖
     13             iu.Insert(user);
     14 
     15             //在iu的数据库中查找unknownUser这个用户
     16             User unknownUser = new User();
     17             unknownUser = iu.GetUser(5);
     18 
     19             //向id数据库中添加dept这个新的用户
     20             Department dept = new Department();
     21             IDepartment id = DataAccess.CreateDepartment();
     22             id.Insert(dept);
     23 
     24             //在id的数据库中查找unknownDept这个用户
     25             Department unknownDept = new Department();
     26             unknownDept = id.GetDepartment(3);
     27 
     28             Console.Read();
     29         }
     30     }
     31 
     32 
     33     /// <summary>
     34     /// 用户类
     35     /// 准备ID和Name两个字段
     36     /// </summary>
     37     class User
     38     {
     39         private int _id;
     40         private string _name;
     41 
     42         public int Id
     43         {
     44             get { return _id; }
     45             set { _id = value; }
     46         }
     47         public string Name
     48         {
     49             get { return _name; }
     50             set { _name = value; }
     51         }
     52     }
     53     /// <summary>
     54     /// 增加一个Department表
     55     /// </summary>
     56     class Department
     57     {
     58         private int _id;
     59         private string _deptName;
     60 
     61         public int Id
     62         {
     63             get { return _id; }
     64             set { _id = value; }
     65         }
     66 
     67         public string DeptName
     68         {
     69             get { return _deptName; }
     70             set { _deptName = value; }
     71         }
     72     }
     73 
     74 
     75 
     76     interface IUser
     77     {
     78         void Insert(User user);
     79         User GetUser(int id);
     80     }
     81 
     82     /// <summary>
     83     /// 用于访问SQL Server的User
     84     /// “增加用户”和“得到用户”两种方法
     85     /// </summary>
     86     class SqlserverUser : IUser
     87     {
     88         /// <summary>
     89         /// 增加用户信息
     90         /// </summary>
     91         /// <param name="user">新的用户信息</param>
     92         public void Insert(User user)
     93         {
     94             Console.WriteLine("在SQL server中给User增加一条记录");
     95         }
     96         /// <summary>
     97         /// 得到用户方法
     98         /// </summary>
     99         /// <param name="id">(传入信息)通过用户的id值</param>
    100         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
    101         public User GetUser(int id)
    102         {
    103             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
    104             return null;
    105         }
    106     }
    107     /// <summary>
    108     /// 用户访问Access的User
    109     /// </summary>
    110     class AccessUser : IUser
    111     {
    112         public User GetUser(int id)
    113         {
    114             Console.WriteLine("在Access中根据ID得到User表一条记录");
    115             return null;
    116         }
    117 
    118         public void Insert(User user)
    119         {
    120             Console.WriteLine("在Access中给User增加一条记录");
    121         }
    122     }
    123 
    124 
    125 
    126     /// <summary>
    127     /// 与User表一致
    128     /// </summary>
    129     interface IDepartment
    130     {
    131         void Insert(Department department);
    132         Department GetDepartment(int id);
    133     }
    134     class SqlserverDepartment : IDepartment
    135     {
    136         public Department GetDepartment(int id)
    137         {
    138             Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
    139             return null;
    140         }
    141 
    142         public void Insert(Department department)
    143         {
    144             Console.WriteLine("在SQL server中给Department增加一条记录");
    145         }
    146     }
    147     class AccessDepartment : IDepartment
    148     {
    149         public Department GetDepartment(int id)
    150         {
    151             Console.WriteLine("在Access中根据ID得到Department表一条记录");
    152             return null;
    153         }
    154 
    155         public void Insert(Department department)
    156         {
    157             Console.WriteLine("在Access中给Department增加一条记录");
    158         }
    159 
    160     }
    161 
    162 
    163     class DataAccess
    164     {
    165         //在此确定需要使用的数据库信息
    166         private static readonly string AssemblyName = "抽象工厂模式5";
    167         private static readonly string db = "Sqlserver";
    168         //private static readonly string db = "Access";
    169         
    170 
    171         public static IUser CreateUser()
    172         {
    173             string className = AssemblyName + "." + db + "User";
    174             //Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
    175             return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
    176         }
    177         public static IDepartment CreateDepartment()
    178         {
    179             string className = AssemblyName + "." + db + "Department";
    180             return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
    181         }
    182     }
    183 }
    View Code

    题目6:在5的基础上,我们只有一点遗憾了:更换数据库访问时,我们还是需要去修改程序,也就是db这个字符串的值

    分析:

      我们可以利用配置文件来更改DataAccess的信息了,这样就不用去程序中修改了。

      

    实现:

      1 using System;
      2 using System.Reflection;//反射
      3 using System.Configuration;
      4 
      5 namespace 抽象工厂模式6
      6 {
      7     class Program
      8     {
      9         static void Main(string[] args)
     10         {
     11             //向iu数据库中添加user这个新的用户
     12             User user = new User();
     13             IUser iu = DataAccess.CreateUser();     //直接得到实际的数据库访问实例,不存在任何依赖
     14             iu.Insert(user);
     15 
     16             //在iu的数据库中查找unknownUser这个用户
     17             User unknownUser = new User();
     18             unknownUser = iu.GetUser(5);
     19 
     20             //向id数据库中添加dept这个新的用户
     21             Department dept = new Department();
     22             IDepartment id = DataAccess.CreateDepartment();
     23             id.Insert(dept);
     24 
     25             //在id的数据库中查找unknownDept这个用户
     26             Department unknownDept = new Department();
     27             unknownDept = id.GetDepartment(3);
     28 
     29             Console.Read();
     30         }
     31     }
     32 
     33 
     34     /// <summary>
     35     /// 用户类
     36     /// 准备ID和Name两个字段
     37     /// </summary>
     38     class User
     39     {
     40         private int _id;
     41         private string _name;
     42 
     43         public int Id
     44         {
     45             get { return _id; }
     46             set { _id = value; }
     47         }
     48         public string Name
     49         {
     50             get { return _name; }
     51             set { _name = value; }
     52         }
     53     }
     54     /// <summary>
     55     /// 增加一个Department表
     56     /// </summary>
     57     class Department
     58     {
     59         private int _id;
     60         private string _deptName;
     61 
     62         public int Id
     63         {
     64             get { return _id; }
     65             set { _id = value; }
     66         }
     67 
     68         public string DeptName
     69         {
     70             get { return _deptName; }
     71             set { _deptName = value; }
     72         }
     73     }
     74 
     75 
     76 
     77     interface IUser
     78     {
     79         void Insert(User user);
     80         User GetUser(int id);
     81     }
     82 
     83     /// <summary>
     84     /// 用于访问SQL Server的User
     85     /// “增加用户”和“得到用户”两种方法
     86     /// </summary>
     87     class SqlserverUser : IUser
     88     {
     89         /// <summary>
     90         /// 增加用户信息
     91         /// </summary>
     92         /// <param name="user">新的用户信息</param>
     93         public void Insert(User user)
     94         {
     95             Console.WriteLine("在SQL server中给User增加一条记录");
     96         }
     97         /// <summary>
     98         /// 得到用户方法
     99         /// </summary>
    100         /// <param name="id">(传入信息)通过用户的id值</param>
    101         /// <returns>(返回信息)通过id值得到对应的用户数据</returns>
    102         public User GetUser(int id)
    103         {
    104             Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
    105             return null;
    106         }
    107     }
    108     /// <summary>
    109     /// 用户访问Access的User
    110     /// </summary>
    111     class AccessUser : IUser
    112     {
    113         public User GetUser(int id)
    114         {
    115             Console.WriteLine("在Access中根据ID得到User表一条记录");
    116             return null;
    117         }
    118 
    119         public void Insert(User user)
    120         {
    121             Console.WriteLine("在Access中给User增加一条记录");
    122         }
    123     }
    124 
    125 
    126 
    127     /// <summary>
    128     /// 与User表一致
    129     /// </summary>
    130     interface IDepartment
    131     {
    132         void Insert(Department department);
    133         Department GetDepartment(int id);
    134     }
    135     class SqlserverDepartment : IDepartment
    136     {
    137         public Department GetDepartment(int id)
    138         {
    139             Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
    140             return null;
    141         }
    142 
    143         public void Insert(Department department)
    144         {
    145             Console.WriteLine("在SQL server中给Department增加一条记录");
    146         }
    147     }
    148     class AccessDepartment : IDepartment
    149     {
    150         public Department GetDepartment(int id)
    151         {
    152             Console.WriteLine("在Access中根据ID得到Department表一条记录");
    153             return null;
    154         }
    155 
    156         public void Insert(Department department)
    157         {
    158             Console.WriteLine("在Access中给Department增加一条记录");
    159         }
    160 
    161     }
    162 
    163 
    164     class DataAccess
    165     {
    166         //在此确定需要使用的数据库信息
    167         private static readonly string AssemblyName = "抽象工厂模式6";
    168         //app.config是配置文件,是标准的XML文件
    169         //我们常常访问的是appSettings,它是由.NET预定义配置的
    170         private static readonly string db = ConfigurationSettings.AppSettings["DB"];
    171 
    172         public static IUser CreateUser()
    173         {
    174             string className = AssemblyName + "." + db + "User";
    175             //Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
    176             return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
    177         }
    178         public static IDepartment CreateDepartment()
    179         {
    180             string className = AssemblyName + "." + db + "Department";
    181             return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
    182         }
    183     }
    184 
    185     /**
    186      * 用简单工厂的地方,可以考虑用反射技术来去除switch或者if,接触分支判断来带的耦合
    187      */
    188 }
    View Code

    总结:

       抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的具体的类。

       抽象工厂模式让具体的创建实例过程与客户端分离。

    注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

  • 相关阅读:
    PMP--4.3-1 进度管理计划
    PMP--4.3 规划进度管理&规划进度管理工具与技术--进度管理计划
    PMP--4.2 规划范围管理--范围管理计划--需求管理计划
    PMP工具与技术篇--4.2.3 WBS分解
    PMP--4.2.3-1 范围基准**--WBS词典
    PMP --4.2.3 创建WBS(工作分解结构)--WBS--范围基准
    PMP工具与技术篇--4.2.2 定义范围工具与技术总结--产品分析
    PMP--4.2.2 定义范围--项目范围说明书
    PMP工具与技术篇--4.2.1-6 原型(DEMO)法
    PMP工具与技术篇--4.2.1-5 观察与交谈(人际关系与团队技能)
  • 原文地址:https://www.cnblogs.com/Aries-rong/p/7799597.html
Copyright © 2011-2022 走看看