工厂方法(FactoryMethod),我也就一句话了:具体的子工厂生产具体的产品,解决了OO的“开放-封闭”原则。
一、先看图:



二、具体实现代码:
1、产品类
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
namespace FactoryLibrary
{
/// <summary>
/// 抽象产品基类
/// </summary>
public abstract class Product
{
abstract public DataTable GetData();
}
/// <summary>
/// 具体产品SQL Server2005,继承自Product类
/// </summary>
public class SqlServer2005 : Product
{
string connectionString = string.Empty;
SqlConnection connection = null;
SqlCommand cmd = null;
SqlDataAdapter dap = null;
DataTable table = null;
/// <summary>
/// 读取SQL Server数据库
/// </summary>
/// <returns></returns>
public override DataTable GetData()
{
try
{
connectionString = ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString.ToString();
connection = new SqlConnection(connectionString);
cmd = new SqlCommand("SELECT EmployeeID,LastName,FirstName,Title FROM Employees", connection);
dap = new SqlDataAdapter(cmd);
table = new DataTable();
dap.Fill(table);
return table;
}
catch
{
return null;
}
finally
{
table.Dispose();
}
}
}
/// <summary>
/// 具体产品Access,继承自Product类
/// </summary>
public class Access : Product
{
string connectionString = string.Empty;
OleDbConnection connection = null;
OleDbCommand cmd = null;
OleDbDataAdapter dap = null;
DataTable table = null;
/// <summary>
/// 读取Access数据库
/// </summary>
/// <returns></returns>
public override DataTable GetData()
{
try
{
connectionString = ConfigurationManager.ConnectionStrings["accessConn"].ConnectionString.ToString();
connection = new OleDbConnection(connectionString);
cmd = new OleDbCommand("SELECT ID,姓氏,名字,电子邮件地址 FROM 员工", connection);
dap = new OleDbDataAdapter(cmd);
table = new DataTable();
dap.Fill(table);
return table;
}
catch
{
return null;
}
finally
{
table.Dispose();
}
}
}
/// <summary>
/// 具体产品Oracle,继承自Product类
/// </summary>
public class Oracle : Product
{
/// <summary>
/// 读取Oracle数据库
/// </summary>
/// <returns></returns>
public override DataTable GetData() { return null; }
}
}
2、工厂类
namespace FactoryLibrary
{
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Factory
{
/// <summary>
/// 工厂方法
/// </summary>
abstract public Product createDataBase();
}
/// <summary>
/// SQL Server工厂,继承自Factory类
/// </summary>
public class SqlServerFactory : Factory
{
/// <summary>
/// 返回SQL Server产品
/// </summary>
/// <returns></returns>
public override Product createDataBase()
{
return new SqlServer2005();
}
}
/// <summary>
/// Access工厂,继承自Factory类
/// </summary>
public class AccessFactory : Factory
{
/// <summary>
/// 返回Access产品
/// </summary>
/// <returns></returns>
public override Product createDataBase()
{
return new Access();
}
}
/// <summary>
/// Oracle工厂,继承自Factory类
/// </summary>
public class OracleFactory : Factory
{
/// <summary>
/// 返回Oracle产品
/// </summary>
/// <returns></returns>
public override Product createDataBase()
{
return new Oracle();
}
}
}
3、客户端
using System;
using System.Windows.Forms;
using FactoryLibrary;
namespace FactoryMethod
{
public partial class mainForm : Form
{
public mainForm()
{
InitializeComponent();
this.rbtnSQLServer.CheckedChanged += new EventHandler(rbtn_CheckedChanged);
this.rbtnOracle.CheckedChanged += new EventHandler(rbtn_CheckedChanged);
this.rbtnAccess.CheckedChanged += new EventHandler(rbtn_CheckedChanged);
}
/// <summary>
/// 事件调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void rbtn_CheckedChanged(object sender, EventArgs e)
{
selectedDB = ((RadioButton)sender).Text;
this.lblSelectedInfo.Text = "您选择了" + selectedDB + "数据库!";
this.gboxSelect.Enabled = false;
this.btnShowData.Enabled = true;
}
/// <summary>
/// 切换数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectNewDB_Click(object sender, EventArgs e)
{
if (this.gboxSelect.Enabled == true)
{
MessageBox.Show("您还没有选择数据库,请选择!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
this.rbtnSQLServer.Checked = false;
this.rbtnOracle.Checked = false;
this.rbtnAccess.Checked = false;
this.gboxSelect.Enabled = true;
this.lblSelectedInfo.Text = null;
this.btnShowData.Enabled = false;
this.dgvShowData.DataSource = null;
}
/// <summary>
/// 存放客户端所选择的数据库
/// </summary>
private string selectedDB = null;
/// <summary>
/// 访问数据库显示数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnShowData_Click(object sender, EventArgs e)
{
switch (selectedDB)
{
case "SQL Server2005":
this.dgvShowData.DataSource = new SqlServerFactory().createDataBase().GetData();
break;
case "Oracle":
break;
case "Access":
this.dgvShowData.DataSource = new AccessFactory().createDataBase().GetData();
break;
default:
break;
}
}
}
}
三、没了。