zoukankan      html  css  js  c++  java
  • 设计模式笔记10: 抽象工厂模式

    1.1  定义

      提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。                                                                                                                                                                                                                                                                                                            

    1.2  类图

                                         

     

    1.3  代码实现

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Configuration;
     4 using System.Linq;
     5 using System.Reflection;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace 抽象工厂模式
    10 {
    11     // 根据数据库名反射创建对应的数据库操作对象
    12     class DataAccess
    13     {
    14         public static readonly string DBStr = ConfigurationManager.AppSettings["db"];
    15         public static readonly string AssemblyName = "抽象工厂模式";
    16 
    17         public static IUser CreateUser()
    18         {
    19             string className = AssemblyName + "." + DBStr + "User";
    20             return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
    21         }
    22 
    23         public static IDepartment CreateDepartment()
    24         {
    25             string className = AssemblyName + "." + DBStr + "Department";
    26             return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
    27         }
    28     }
    29 
    30     interface IUser
    31     {
    32         void GetUser();
    33     }
    34 
    35     class SqlServerUser : IUser
    36     {
    37         public void GetUser()
    38         {
    39             Console.WriteLine("用SqlServer从USer取数据");
    40         }
    41     }
    42 
    43     class AccessUser : IUser
    44     {
    45         public void GetUser()
    46         {
    47             Console.WriteLine("用Access从USer取数据");
    48         }
    49     }
    50 
    51     interface IDepartment
    52     {
    53         void GetDepartment();
    54     }
    55 
    56     class SqlServerDepartment : IDepartment
    57     {
    58         public void GetDepartment()
    59         {
    60             Console.WriteLine("用SqlServer从Department取数据");
    61         }
    62     }
    63 
    64     class AccessDepartment : IDepartment
    65     {
    66         public void GetDepartment()
    67         {
    68             Console.WriteLine("用Access从Department取数据");
    69         }
    70     }
    71 
    72 
    73 }
    View Code

    调用:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 抽象工厂模式
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             IUser user = DataAccess.CreateUser();
    14             user.GetUser();
    15 
    16             IDepartment dep = DataAccess.CreateDepartment();
    17             dep.GetDepartment();
    18         }
    19     }
    20 }
    View Code

    配置文件:

      <appSettings>
        <add key="db" value="SqlServer"/>
        <!--<add key="db" value="Access"/>-->
      </appSettings>

    1.4  总结

     

      1、用户表接口 含CRUD操作 ,每个子类操作一种数据库。

      2、 根据配置文件的db字符,反射创建需要的数据库。这样做我们只需要修改配置文件就可以实现数据库的切换了。

                                                                                                                                                                                                                   

  • 相关阅读:
    IP报头结构
    C#组件项目设置与开发应用范例
    UDP数据报协议
    WOW 各等级属性换算表
    清理SQLSERVER日志
    正则表达式匹配EXCEL地址字符串
    TCP数据段格式
    MAC地址结构
    (转载) Delphi中打印条码的方法
    为了使用uart2, 发现6252中define了 SCCB_SERIAL_CLK_PIN 值为 22, 为了避免冲突, 手动修改其值为 23
  • 原文地址:https://www.cnblogs.com/simple-blog/p/4149968.html
Copyright © 2011-2022 走看看