设计模式——抽象工厂模式

  抽象工厂模式——提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体的类。

  抽象工厂模式可以算设计模式中一个明星模式了,它完全实现了低耦合,配合反射一起应用的话,完全实现实现类之间无任何耦合,它可以改变一个应用的具体工厂,这非常容易实现,它只需要改变具体工厂即可使用不同的产品配置

  同时,他让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端中。

1.User类,实体类,定义了姓名和ID两个属性

 1 /// <summary>
 2 /// 用户表
 3 /// </summary>
 4 public class User
 5 {
 6     /// <summary>
 7     /// 姓名
 8     /// </summary>
 9     public string Name { get; set; }
10 
11     /// <summary>
12     /// Id
13     /// </summary>
14     public int Id { get; set; }
15 }
User.cs

2.IUser类,用户表接口,定义了插入和查询两个方法

 1 /// <summary>
 2 /// 定义用户表接口
 3 /// </summary>
 4 public interface IUser
 5 {
 6     /// <summary>
 7     /// 提供插入数据方法
 8     /// </summary>
 9     /// <param name="user">用户实体</param>
10     void Insert(User user);
11 
12     /// <summary>
13     /// 提供查询数据方法
14     /// </summary>
15     /// <param name="id">用户id</param>
16     /// <returns></returns>
17     User GetUsr(int id);
18 }
IUser.cs

3.SqlServerUser类,继承IUse接口,具体实现用SqlServer数据库连接方法得到User的方法

 1 class SqlServerUser:IUser
 2 {
 3     public void Insert(User user)
 4     {
 5         Console.WriteLine("在SQL Server中给User表插入一条数据");
 6     }
 7 
 8     public User GetUsr(int id)
 9     {
10         Console.WriteLine("在SQL Server中根据Id查询User表得到一条数据");
11         return null;
12     }
13 }
SqlServerUser.cs

4.AccessUser类,继承IUse接口,具体实现用SqlServer数据库连接方法得到User的方法

 1 class AccessUser:IUser
 2 {
 3     public void Insert(User user)
 4     {
 5         Console.WriteLine("在SQL Server中给User表插入一条数据");
 6     }
 7 
 8     public User GetUsr(int id)
 9     {
10         Console.WriteLine("在SQL Server中根据Id查询User表得到一条数据");
11         return null;
12     }
13 }
AccessUser.cs

5.DataAccess类,利用反射+配置文件动态配置采用哪种数据库连接

 1 /// <summary>
 2 /// 数据库操作类
 3 /// </summary>
 4 public class DataAccess
 5 {
 6     /// <summary>
 7     /// 程序集名称
 8     /// </summary>
 9     private const string AssemblyName = "抽象工厂模式";
10 
11     //数据库的名称
12     private static readonly string DataBaseName = ConfigurationManager.AppSettings["DB"];
13 
14     public static IUser CreateUser()
15     {
16         //定义反射出来对象的类名
17         string clasName = AssemblyName + "." + DataBaseName + "User";
18 
19         //反射回对象,等于new了一个对象
20         return (IUser) Assembly.Load(AssemblyName).CreateInstance(clasName);
21 
22     }
23 
24     //这里可以创建其他表对象
25 }
DataAccess.cs

6.App.config配置文件,配置了采取哪种数据库连接

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <appSetting>
4     <add key="DB" value="Sqlserver">
5   </appSetting>
6 </configuration>
App.config

  抽象工厂模式是很强大的,但是也有它的缺点,那就是本身太臃肿,定义的类太多,虽然完全实现了低耦合,但是在高内聚方面表现的很一般,鱼和熊掌不可兼得,有得必有失,在设计之中,没有最好,只有最对的。

                                                          以上内容部分参考程杰的《大话设计模式》一书

posted @ 2013-05-29 22:30  Kitten Zhang  阅读(129)  评论(0编辑  收藏  举报