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


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

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

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

    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

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

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

  • 相关阅读:
    ASP.NET MVC 1.0 + spring.net 1.2.0.20288 + NHibernate 2.0.1.4000整合笔记(一)——准备工作
    OpenWRT 编译过程
    XNA 3D模型入门讲解(一)
    Windows Phone7 中实现主从视图
    MVVM之ViewModel
    XNA 三维入门讲解
    WF 4.0 之持久化操作二:Xml方式的存储
    Nhibernate下使用Oracle提示 “Could not create the driver from NHibernate.Driver.OracleDataClientDriver”
    Win8 :修改默认的初始屏幕背景
    Javascript中单引号和双引号引发的悲剧
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3107161.html
Copyright © 2020-2023  润新知