抽象工厂模式——提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体的类。
抽象工厂模式可以算设计模式中一个明星模式了,它完全实现了低耦合,配合反射一起应用的话,完全实现实现类之间无任何耦合,它可以改变一个应用的具体工厂,这非常容易实现,它只需要改变具体工厂即可使用不同的产品配置
同时,他让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端中。
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 }
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 }
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 }
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 }
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 }
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>
抽象工厂模式是很强大的,但是也有它的缺点,那就是本身太臃肿,定义的类太多,虽然完全实现了低耦合,但是在高内聚方面表现的很一般,鱼和熊掌不可兼得,有得必有失,在设计之中,没有最好,只有最对的。
以上内容部分参考程杰的《大话设计模式》一书