设为首页 加入收藏

TOP

抽象工厂模式(13)(二)
2017-10-13 10:39:17 】 浏览:7369
Tags:抽象 工厂 模式
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 分支。

之前我们也曾提到过相关的问题,就是用 反射 来解决,但一直没有展开来讲,那么下篇博文,我们来给大家讲一讲如何用反射的技术来解决这些问题。

反射反射,程序员的快乐~

好了,今天我们先讲到这里,下一篇我们将用反射技术来解决相关的问题~


本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从RPC开始(二)、序列化 下一篇从真实项目中抠出来的设计模式—..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目