epartment GetDepartment(int id)
61 {
62 Console.WriteLine("在Oracle 中 根据ID 获取Department 表一条记录");
63 return null;
64 }
65 }
工厂接口与实现中也新增了方法
1 interface IFactory
2 {
3 IUser CraeteUser();
4 IDepartment CreateDepartment();
5 }
6
7 class SqlServerFactory:IFactory
8 {
9 public IUser CraeteUser()
10 {
11 return new SqlserverUser();
12 }
13
14 public IDepartment CreateDepartment()
15 {
16 return new SqlServerDepartment();
17 }
18 }
19 class OracleFactory : IFactory
20 {
21 public IUser CraeteUser()
22 {
23 return new OracleUser();
24 }
25
26 public IDepartment CreateDepartment()
27 {
28 return new OracleDepartment();
29 }
30 }
经过我们这么一步一步的演化,我们重构出了一个非常重要的设计模式,抽象工厂模式。小伙伴们会说,刚刚这不是工厂方法模式吗。
只有一个User表的时候,是只需要工厂方法模式的,但是我们数据库中显然有非常多的表,还SqlServer 和Oracle 这两大分支,所以涉及到解决多种产品分支的问题,有一个专门的工厂模式,叫抽象工厂模式。
什么叫抽象工厂模式呢?提供一系列相关或相互依赖的接口,而无需指定他们具体的类。
这就是抽象工厂模式,他的优缺点很明显。
优点:灵活,产品系列零活切换。
缺点:如果我们再增加一个表,需要改动的地方太多了,需要增加三个类,需要修改三个类,靠,太麻烦了吧。
客户端每一次使用时,需要new 一下,如果客户端有好多处调用的,那么就需要new 好多次。 这些都是他的缺点。
编程是一门艺术,这样大批量的改动,显然是非常丑陋的做法。
我们这里有一个改进的方法,就是用简单工厂方法改进抽象工厂模式。
我们新增加一个类
1 class DataAccess
2 {
3 private static readonly string db = "SqlServer";
4 // private static readonly string db = "Oracle";
5 public static IUser CreateUser()
6 {
7 IUser result = null;
8 switch (db)
9 {
10 case "SqlServer":
11 result = new SqlserverUser();
12 break;
13 case "Oracle":
14 result = new OracleUser();
15 break;
16 }
17 return result;
18 }
19
20 public static IDepartment CreateDepartment()
21 {
22 IDepartment result = null;
23 switch (db)
24 {
25 case "SqlServer":
26 result = new SqlServerDepartment();
27 break;
28 case "Oracle":
29 result = new OracleDepartment();
30 break;
31 }
32 return result;
33 }
34 }
嗯,这样,客户端调用的时候就好调用了。
1 public static void Main()
2 {
3 User user = new User();
4 Department dept = new Department();
5 IUser iu = DataAccess.CreateUser();
6 iu.Insert(user);
7 iu.GetUser(1);
8 IDepartment d = DataAccess.CreateDepartment();
9 d.Insert(dept);
10 d.GetDepartment(1);
11 Console.ReadKey();
12 }
ok,那么如果我还想增加一个数据库类型的分支,比如Access数据库,那么需要在DataAccess类的方法中增加一个case 分支。
之前我们也曾提到过相关的问题,就是用 反射 来解决,但一直没有展开来讲,那么下篇博文,我们来给大家讲一讲如何用反射的技术来解决这些问题。
反射反射,程序员的快乐~
好了,今天我们先讲到这里,下一篇我们将用反射技术来解决相关的问题~
本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。