zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    一、为什么要用抽象工厂模式。

      举个例子吧,有个项目,最开始是连接的SQLServer,后来由于某种原因,需要连接MySql,再后来你又需要连接到Oracle等,那么此时你需要更改的地方有很多。为了尽量少的增加和修改代码,就可以在设计最初的时候采用抽象工厂设计模式。下面是代码,就是为了简单的演示下(刚学的设计模式,有不对的地方,欢迎指出。):

    二、代码。

    namespace 抽象工厂模式
    {
        public class MySql:Factory
        {
            public override void SelectDb()
            {
                Console.WriteLine("连接MySql数据库!");
            }
        }
    }
    namespace 抽象工厂模式
    {
        public class SqlServer:Factory
        {
            public override void SelectDb()
            {
                Console.WriteLine("连接SqlServer数据库");
            }
        }
    }
    namespace 抽象工厂模式
    {
        /// <summary>
        /// 工厂方法
        /// </summary>
        public abstract class Factory
        {
            //IDB _db = null;
            static Factory _db = null;
            public static void ConnectDB() 
            {
                string sqlStr = ReadXmlNode(@"C:\Users\xiaoyi\Desktop\功能点实例\小功能测试专用程序\Test\抽象工厂模式\AppConfig.xml");
                if (string.IsNullOrEmpty(sqlStr))
                {
                    Console.WriteLine("读取配置文件出错!");
                }
                else 
                {
                    System.Type tt = System.Type.GetType(sqlStr);//获取指定名称的类型
    
                    _db = (Factory)Activator.CreateInstance(tt, null);//创建指定类型实例
                    
                    _db.SelectDb();
                    
                }
                
            }
    
            public abstract void SelectDb();
    
            public static string ReadXmlNode(string filename)
            {
                XmlDocument xmlDoc = new XmlDocument();
                string sqlStr = "";
                try
                {
                    xmlDoc.Load(filename);
                    //读取Activity节点下的数据。SelectSingleNode匹配第一个Activity节点  
                    XmlNode root = xmlDoc.SelectSingleNode("//db");//当节点Workflow带有属性是,使用SelectSingleNode无法读取          
                    if (root != null)
                    {
                        sqlStr = (root.SelectSingleNode("sql")).InnerText;
    
                    }
    
                }
                catch (Exception e)
                {
    
                }
                return sqlStr;
            }  
        }
    }
    View Code
    namespace 抽象工厂模式
    {
        class Program
        {
            static void Main(string[] args)
            {   
                Factory.ConnectDB();
                Console.ReadLine();
            }
    
            
        }
    }
    <?xml version="1.0" encoding="utf-8" ?>
    <db>
      <sql name="db">抽象工厂模式.SqlServer</sql>
    </db>

    三、注意的地方。

      最主要的还是用到通过反射机制,得到对象,不需要创建明确对象来调用方法。使用了这种设计模式,后期如果需要加入连接Oracle数据库,只需要增加一个Oracle类继承Factory工厂类方法,将配置文件内的字段换一下就可以了。

  • 相关阅读:
    Django--templates(模板层)
    基于 Hive 的文件格式:RCFile 简介及其应用
    Gobblin采集kafka数据
    Scala 中下划线的用途
    Gobblin编译支持CDH5.4.0
    Kafka到Hdfs的数据Pipeline整理
    Hadoop NameNode的ZKFC机制
    Windows下Eclipse提交MR程序到HadoopCluster
    Kettle实现MapReduce之WordCount
    hadoop中MapReduce多种join实现实例分析
  • 原文地址:https://www.cnblogs.com/yxzs/p/5707453.html
Copyright © 2011-2022 走看看