一、为什么要用抽象工厂模式。
举个例子吧,有个项目,最开始是连接的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;
}
}
}
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工厂类方法,将配置文件内的字段换一下就可以了。