设为首页 加入收藏

TOP

抽象工厂模式(13)(一)
2017-10-13 10:39:17 】 浏览:7368
Tags:抽象 工厂 模式

今天呢,给大家来讲一下抽象工厂模式,说到这里,大家会想到好多种关于工厂的模式,前面已经讲了两种了 简单工厂模式和工厂方法模式。好,下面我们来看一下抽象工厂模式。

同样,我们来举一个案例

一、案例

我们在做项目的时候,肯定会与数据库打交道,那么我们用简单的控制台应用程序来模拟一个向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
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从RPC开始(二)、序列化 下一篇从真实项目中抠出来的设计模式—..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目