抽象工厂模式

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

  举个例子吧,有个项目,最开始是连接的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工厂类方法,将配置文件内的字段换一下就可以了。

原文地址:https://www.cnblogs.com/yxzs/p/5707453.html