今天呢,给大家来讲一下抽象工厂模式,说到这里,大家会想到好多种关于工厂的模式,前面已经讲了两种了 简单工厂模式和工厂方法模式。好,下面我们来看一下抽象工厂模式。
同样,我们来举一个案例
一、案例
我们在做项目的时候,肯定会与数据库打交道,那么我们用简单的控制台应用程序来模拟一个向SqlServer数据库表中插入和读取的情况。
1 /// <summary>
2 /// User中的字段
3 /// </summary>
4 class User
5 {
6 private int _id;
7
8 public int Id
9 {
10 get
11 {
12 return _id;
13 }
14
15 set
16 {
17 _id = value;
18 }
19 }
20
21 public string Name
22 {
23 get
24 {
25 return _name;
26 }
27
28 set
29 {
30 _name = value;
31 }
32 }
33
34 private string _name;
35 }
36 /// <summary>
37 /// SqlServer类
38 /// </summary>
39 class SqlserverUser
40 {
41 public void Insert(User user)
42 {
43 Console.WriteLine("在Sql server 中 给User 表增加一条记录");
44 }
45
46 public User GetUser(int id)
47 {
48 Console.WriteLine($"在Sql server 中根据ID获取User表中的一条记录");
49 return null;
50 }
51 }
客户端调用:
1 internal class Program
2 {
3 public static void Main()
4 {
5 User user = new User();
6 SqlserverUser su = new SqlserverUser();
7 su.Insert(user);
8 su.GetUser(1);
9 Console.ReadKey();
10 }
二、演绎
1、第一步演绎
那么问题来了,如果我这个项目数据库换成Oracle,那么我岂不是都要改了,如果想实现自由的切换数据库,我们想到了一个不错的模式,对,工厂方法模式。
让他们都依赖于抽象,所以我们在这里增加两个接口
1 interface IUser
2 {
3 void Insert(User user);
4 User GetUser(int id);
5 }
6
7 interface IFactory
8 {
9 IUser CraeteUser();
10 }
让User 和 SqlServer 等类继承相应的接口
1 /// <summary>
2 /// SqlServer类
3 /// </summary>
4 class SqlserverUser :IUser
5 {
6 public void Insert(User user)
7 {
8 Console.WriteLine("在Sql server 中 给User 表增加一条记录");
9 }
10
11 public User GetUser(int id)
12 {
13 Console.WriteLine($"在Sql server 中根据ID获取User表中的一条记录");
14 return null;
15 }
16 }
17
18 class OracleUser:IUser
19 {
20 public void Insert(User user)
21 {
22 Console.WriteLine("在Oracle 中 给User 表增加一条记录");
23 }
24
25 public User GetUser(int id)
26 {
27 Console.WriteLine($"在Oracle 中根据ID获取User表中的一条记录");
28 return null;
29 }
30 }
1 class SqlServerFactory:IFactory
2 {
3 public IUser CraeteUser()
4 {
5 return new SqlserverUser();
6 }
7 }
8 class OracleFactory : IFactory
9 {
10 public IUser CraeteUser()
11 {
12 return new OracleUser();
13 }
14 }
客户端
1 public static void Main()
2 {
3 User user = new User();
4 IFactory factory = new SqlServerFactory();
5 IUser su = factory.CraeteUser();
6 su.Insert(user);
7 su.GetUser(1);
8 Console.ReadKey();
9 }
以上,我们将案例用工厂方法模式写出来了。
2、第二步演绎
我们的数据库中,不可能之后User表,还有很多其他的表,这样就会产生好多的类哦。
下面,我们在增加一个表(Department)
那么,按照上面的模式就会产生一下面的一坨代码
1 class Department
2 {
3 private int _id;
4
5 public int Id
6 {
7 get
8 {
9 return _id;
10 }
11
12 set
13 {
14 _id = value;
15 }
16 }
17
18 public string Name
19 {
20 get
21 {
22 return _name;
23 }
24
25 set
26 {
27 _name = value;
28 }
29 }
30
31 private string _name;
32 }
33 interface IDepartment
34 {
35 void Insert(Department department);
36 Department GetDepartment(int id);
37 }
38
39 class SqlServerDepartment:IDepartment
40 {
41 public void Insert(Department department)
42 {
43 Console.WriteLine("在SqlServer 中 给Department 表增加一条记录");
44 }
45
46 public Department GetDepartment(int id)
47 {
48 Console.WriteLine("在SqlServer 中 根据ID 获取Department 表一条记录");
49 return null;
50 }
51 }
52
53 class OracleDepartment : IDepartment
54 {
55 public void Insert(Department department)
56 {
57 Console.WriteLine("在Oracle 中 给Department 表增加一条记录");
58 }
59
60 public D