1。意图
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。在GOF的设计模式中没有简单工厂,而是将其作为工厂方法的一个特例加以解释。可以这样理解,简单工厂是参数化的工厂方法。
2。使用场合
简单工厂实例化的类具有相同的接口,种类有限并且基本不需要扩展时,可以使用简单工厂。
3。效果
采用简单工厂的优点:可以使用户根据参数获得对应的类的实例,避免了直接实例化,降低了耦合性。缺点:可以实例化的类型在编译期间已经被确定如果增加新类型,则需要修改工厂。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适宜使用。
4。实现
通常简单工厂不需要实例化,而是采用静态方法。
5。例子
在web程序中,我们一般利用web.config文件配置数据库的连接字符串,然后在程序运行的时候读取这些字符串连接数据库,然后进行数据库的操作,但是有时候我们需要程序支持不同的数据库,比如支持SqlServer与Access(当然这些数据库的结构应该一样),这个时候我们可以利用简单工厂模式根据读取得不同的数据库类型来决定程序运行的时候最终要实例化那一种数据库,而且同时也决定最终要如何读取web.conf中的不同的数据库连接字符串。下面给出类图。
6。代码
类DBSimplyFactory
namespace SimplyFactory
{
/// <summary>
/// DBSimplyFactory 的摘要说明。
/// </summary>
public class DBSimplyFactory
{
public DBSimplyFactory()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static CommonDB CreatDataBase( string DataStyle, string connStr)
{
CommonDB commonDB = null ;
switch (DataStyle)
{
case " SQL " :
commonDB = new SqlDB(connStr);
break ;
case " OLE " :
commonDB = new OleDB(connStr);
break ;
}
return commonDB;
}
}
}
类CommonDB
using System.Data;
namespace SimplyFactory
{
/// <summary>
/// CommonDB 的摘要说明。
/// </summary>
public abstract class CommonDB
{
public CommonDB()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public CommonDB( string connString)
{
connStr = connString;
}
protected string connStr;
public abstract DataTable ExeSql( string qureString);
public abstract void Open();
public abstract void Close();
}
}
类SqlDB
using System.Data;
using System.Data.SqlClient;
namespace SimplyFactory
{
/// <summary>
/// SqlDB 的摘要说明。
/// </summary>
public class SqlDB:CommonDB
{
private SqlConnection SqlConn = null ;
public SqlDB()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public SqlDB( string sqlConnString)
{
this .connStr = sqlConnString;
}
public override void Open()
{
SqlConn = new SqlConnection(connStr);
SqlConn.Open();
}
public override void Close()
{
SqlConn.Close();
}
public override System.Data.DataTable ExeSql( string qureString)
{
SqlCommand sqlCommand = new SqlCommand(qureString,SqlConn);
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCommand);
DataTable sqlDataTable = new DataTable();
sqlAdapter.Fill(sqlDataTable);
return sqlDataTable;
}
}
}
类OleDB
using System.Data;
using System.Data.OleDb;
namespace SimplyFactory
{
/// <summary>
/// OleDB 的摘要说明。
/// </summary>
public class OleDB:CommonDB
{
private OleDbConnection OleConn = null ;
public OleDB()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public OleDB( string oleConnString)
{
this .connStr = oleConnString;
}
public override void Open()
{
OleConn = new OleDbConnection(connStr);
OleConn.Open();
}
public override void Close()
{
OleConn.Close();
}
public override System.Data.DataTable ExeSql( string qureString)
{
OleDbCommand oleCommand = new OleDbCommand(qureString,OleConn);
OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);
DataTable oleDataTable = new DataTable();
oleAdapter.Fill(oleDataTable);
return oleDataTable;
}
}
}
类ReadConfigFactory
namespace SimplyFactory
{
/// <summary>
/// ReadConfigFactory 的摘要说明。
/// </summary>
public class ReadConfigFactory
{
public ReadConfigFactory()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static ReadConfig CreatReadConfig( string dbStyle)
{
ReadConfig EntityConfig = null ;
switch (dbStyle)
{
case " SQL " :
EntityConfig = new ReadSqlConfig();
break ;
case " OLE " :
EntityConfig = new ReadOleConfig();
break ;
}
return EntityConfig;
}
}
}
类ReadConfig
namespace SimplyFactory
{
/// <summary>
/// ReadConfig 的摘要说明。
/// </summary>
public abstract class ReadConfig
{
public ReadConfig()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private static string ServerStyle = System.Configuration .ConfigurationSettings .AppSettings [ " ServerStyle " ];
public static string GetDataStyle()
{
return ServerStyle;
}
public abstract string GetConnString();
}
}
类ReadSqlConfig
namespace SimplyFactory
{
/// <summary>
/// ReadConfig 的摘要说明。
/// </summary>
public class ReadSqlConfig:ReadConfig
{
public ReadSqlConfig()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private static string SERVER = System.Configuration.ConfigurationSettings.AppSettings[ " ServerName " ];
private static string DATABASE = System.Configuration .ConfigurationSettings .AppSettings [ " DataBase " ];
private static string UID = System.Configuration .ConfigurationSettings .AppSettings [ " UserId " ];
private static string PWD = System.Configuration .ConfigurationSettings .AppSettings [ " PassWord " ];
private static string ConnStr = " server= " + SERVER + " ;database= " + DATABASE + " ;uid= " + UID + " ;pwd= " + PWD + " ; " ;
public override string GetConnString()
{
return ConnStr;
}
}
}
类ReadOleConfig
namespace SimplyFactory
{
/// <summary>
/// ReadOleConfig 的摘要说明。
/// </summary>
public class ReadOleConfig:ReadConfig
{
public ReadOleConfig()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private string preConnStr = System.Configuration.ConfigurationSettings.AppSettings[ " preConnStr " ];
private string secConnStr = System.Configuration.ConfigurationSettings.AppSettings[ " secConnStr " ];
public override string GetConnString()
{
return preConnStr + System.Web.HttpContext.Current.Server.MapPath(secConnStr) + " ; " ;
}
}
}
web.config文件的配置
SqlServer的例子介绍
<add key="ServerStyle" value="SQL"/>
<add key="ServerName" value="SqlServer" />
<add key="DataBase" value="student" />
<add key="UserId" value="" />
<add key="PassWord" value="" />
ACCESS的例子介绍
<add key="ServerStyle" value="OLE"/>
<add key="preConnStr" value="provider=microsoft.jet.oledb.4.0;data source="/>
<add key="secConnStr" value="/SimplyFactory/data/student.mdb"/>
-->
< appSettings >
< add key ="ServerStyle" value ="OLE" />
< add key ="preConnStr" value ="provider=microsoft.jet.oledb.4.0;data source=" />
< add key ="secConnStr" value ="/SimplyFactory/data/student.mdb" />
</ appSettings >
读取数据的代码,我写在了Page_Load中
{
// 在此处放置用户代码以初始化页面
string dataStyle = ReadConfig.GetDataStyle();
ReadConfig entityReadConfig = ReadConfigFactory.CreatReadConfig(dataStyle);
string connStr = entityReadConfig.GetConnString();
CommonDB commondb = DBSimplyFactory.CreatDataBase(dataStyle,connStr);
commondb.Open();
string mySelectString = " select stu_id,stu_name,dep_name from stu_infor " ;
DataTable stu_infor = commondb.ExeSql(mySelectString);
commondb.Close();
DataGrid1.DataSource = stu_infor.DefaultView;
DataGrid1.DataBind();
}
其中数据库的设计样式为下图
代码运行结果如下: