工厂模式在.net中实现
问题:
有个页面要普通的列表显示和图表显示.
解决方法:
分别定义两个用户控件:ChartList.ascx和DataGridList.ascx.
抽象出来一个类工厂,abstractFactory.如下图
//ChartList.ascx和DataGridList.ascx控件类都是System.Web.UI.UserControl的派生类,同时继承了一个接口IView,其中只有一个方法,BindList()
//举例很简单,接口可以扩展。。。
我们来看看,abstractFactory如何为我们提供相应的“产品“
public class abstractFactory
{
public enum ViewType
{
chart,Datagrid
}
private IView _iView;
public IView IView
{
get {return _iView; }
}
private System.Web.UI.WebControls.PlaceHolder _placeHolder = new System.Web.UI.WebControls.PlaceHolder();
public System.Web.UI.WebControls.PlaceHolder MyHolder
{
get{return _placeHolder;}
}
public abstractFactory(int ViewType)
{
switch(ViewType)
{
case (int)ViewType.chart:
ChartList c = new ChartList();
_iView = c;
_placeHolder.Controls.Add(c);
break;
case (int)ViewType.Datagrid:
DataGridList d = new DataGridList();
_iView = d;
_placeHolder.Controls.Add(d);
break;
}
}
}
//定义的接口
public interface IView
{
void BindList();
}
//DataGridList和ChartList具体的代码这里没有给出。
{
public enum ViewType
{
chart,Datagrid
}
private IView _iView;
public IView IView
{
get {return _iView; }
}
private System.Web.UI.WebControls.PlaceHolder _placeHolder = new System.Web.UI.WebControls.PlaceHolder();
public System.Web.UI.WebControls.PlaceHolder MyHolder
{
get{return _placeHolder;}
}
public abstractFactory(int ViewType)
{
switch(ViewType)
{
case (int)ViewType.chart:
ChartList c = new ChartList();
_iView = c;
_placeHolder.Controls.Add(c);
break;
case (int)ViewType.Datagrid:
DataGridList d = new DataGridList();
_iView = d;
_placeHolder.Controls.Add(d);
break;
}
}
}
//定义的接口
public interface IView
{
void BindList();
}
//DataGridList和ChartList具体的代码这里没有给出。
接着在一个页面里面完成最后的工作。
public class DocumentInfo : System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;
protected System.Web.UI.WebControls.DropDownList DropDownList1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
DropDownList1.Items.Add(new ListItem(abstractFactory.ViewType.chart.ToString(),abstractFactory.ViewType.chart.ToString()));
DropDownList1.Items.Add(new ListItem(abstractFactory.ViewType.Datagrid.ToString(),abstractFactory.ViewType.Datagrid.ToString()));
abstractFactory a1 =new abstractFactory(Convert.ToInt32(DropDownList1.SelectedValue));
PlaceHolder1 = a1.MyHolder;
a1.IView.BindList();
}
}
{
protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;
protected System.Web.UI.WebControls.DropDownList DropDownList1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
DropDownList1.Items.Add(new ListItem(abstractFactory.ViewType.chart.ToString(),abstractFactory.ViewType.chart.ToString()));
DropDownList1.Items.Add(new ListItem(abstractFactory.ViewType.Datagrid.ToString(),abstractFactory.ViewType.Datagrid.ToString()));
abstractFactory a1 =new abstractFactory(Convert.ToInt32(DropDownList1.SelectedValue));
PlaceHolder1 = a1.MyHolder;
a1.IView.BindList();
}
}