zoukankan      html  css  js  c++  java
  • C#反射—解决类的实例化问题

    利用简单工厂模式来改进抽象工厂使用的复杂性(抽象工厂详见 设计模式之—抽象工厂模式

    数据表(User)业务处理接口(IUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        interface IUser
        {
            void Insert(User user);
            void GetUser(string id);
        }
    }
    View Code

    数据表(Department)业务处理接口(IDepartment)

    namespace FactoryMethodPatternDB.CLASS
    {
        interface IDepartment
        {
            void Insert(Department dept);
            void GetDept(string id);
        }
    }
    View Code

    SQL操作表(User)类(SqlServerUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        class SqlServerUser:IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在User表中插入一条数据{0}!SQL数据库",user);
            }
    
            public void GetUser(string id)
            {
                Console.WriteLine("通过{0}来查找数据!SQL数据库", id);
            }
        }
    }
    View Code

    SQL操作表(Department)类(SqlServerDepartment)

    namespace FactoryMethodPatternDB.CLASS
    {
        class SqlServerDepartment:IDepartment
        {
            public void Insert(Department dept)
            {
                Console.WriteLine("在{0}表中插入数据!SQL数据库", dept);
            }
            public void GetDept(string id)
            {
                Console.WriteLine("通过{0}查找数据库表!SQL数据库", id);
            }
    
        }
    }
    View Code

    ACCESS操作表(User)类(AccessUser)

    namespace FactoryMethodPatternDB.CLASS
    {
        class AccessUser:IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("在{0}表中插入数据!Access数据库",user);
            }
            public void GetUser(string id)
            {
                Console.WriteLine("通过{0}查找数据库表!Access数据库",id);
            }
        }
    }
    View Code

    ACCESS操作表(Department)类(AccessDepartment)

    namespace FactoryMethodPatternDB.CLASS
    {
        class AccessDepartment:IDepartment
        {
            public void Insert(Department dept)
            {
                Console.WriteLine("在{0}表中插入数据!Access数据库", dept);
            }
            public void GetDept(string id)
            {
                Console.WriteLine("通过{0}查找数据库表!Access数据库", id);
            }
        }
    }
    View Code

    工厂接口和工厂类被SelectDB替换:

    namespace FactoryMethodPatternDB
    {
        class SelectDB
        {
            //private static readonly string db = "Sqlserver";
            private static readonly string db = "Access";
            public static IUser CreateUser()
            {
                IUser iuser = null;
                switch (db)
                {
                    case "Sqlserver":
                        iuser = new SqlServerUser();
                        break;
                    case "Access":
                        iuser = new AccessUser();
                        break;
                }
                return iuser;
            }
    
            public static IDepartment CreateDept()
            {
                IDepartment idept = null;
                switch (db)
                {
                    case "Sqlserver":
                        idept = new SqlServerDepartment();
                        break;
                    case "Access":
                        idept = new AccessDepartment();
                        break;
                }
                return idept;
            }
        }
    }
    View Code

    简单工厂模式测试类

          //简单工厂与抽象工厂模式相结合
              User user = new User();
                Department dept = new Department();
                IUser iuser = SelectDB.CreateUser();
                iuser.Insert(user);
                iuser.GetUser("ID");
                IDepartment idept = SelectDB.CreateDept();
                idept.Insert(dept);
                idept.GetDept("name");
    View Code

      

    若增加Oracle数据库,则需要更改Switch语句块 违背开放-封闭原则。解决此问题的方法是采用反射

    将SelectDB换成反射类(Reflection)

    添加反射引用命名空间using System.Reflection;

    using System.Reflection;
    namespace FactoryMethodPatternDB
    {
        class Reflection
        {
            private static readonly string AssemblyName = "FactoryMethodPatternDB"; //程序集
            private static readonly string db = "SqlServer";  //业务类的名称为SqlServer + 表名 如(SqlServerUser)方便反射使用
    
            public static IUser CreateUser()
            {
                string className = AssemblyName + ".CLASS." + db  + "User"; //类名(带命名空间)
                return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
            }
    
            public static IDepartment CreateDept()
            {
                string className = AssemblyName + "." + "Department";
                return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
            }
        }
    }
    View Code

     反射测试类

       //反射与抽象工厂模式相结合
              User user = new User();
                Department dept = new Department();
                IUser iuser = Reflection.CreateUser();
                iuser.Insert(user);
                iuser.GetUser("ID");
    
                IDepartment idept = Reflection.CreateDept();
                idept.Insert(dept);
                idept.GetDept("Name");
    View Code

     

  • 相关阅读:
    pytorch lstm crf 代码理解
    python sys.argv是什么?
    如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?
    jieba分词工具的使用方法
    手把手教你用Python实现自动特征工程
    命名实体识别视频51cto
    命名实体识别入门教程(必看)
    零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)
    自然语言处理深度学习篇-BiLSTM文本挖掘实践 命名实体识别
    导航栏颜色
  • 原文地址:https://www.cnblogs.com/zxd543/p/3250345.html
Copyright © 2011-2022 走看看