买了《java与模式》这本书,在学习的过程中,顺便记录了一些,纯属个人学习总结,不保证正确性。
非常感谢能够看到该文章的前辈,为小弟指正文章中的错误。
本人最近的工作是做移动综合告警资源管理系统b/s模块的开发。
因此,本节的代码都将关系着该系统里面的一些相关业务。
首先,介绍 移动综合告警资源管理系统b/s模块。
本系统涉及到四个专业模块,分别是 话务,传输,动环,数据,每个专业都有对相关专业信息处理的类。并且,现阶段也只有前面三个专业的数据。
按照简单工厂的方法,需要先设计一个接口或者抽象类,用来约束各个专业数据的处理方式。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace 简单工厂
{
public interface ISpeciality<T> where T : IDomain
{
#region 新增一条数据
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
bool InserOneInfo(T t);
#endregion
#region 得到一条信息
/// <summary>
/// 得到一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
DataTable GetOneInfo(string strIntId);
#endregion
#region 得到所有信息
/// <summary>
/// 得到所有信息
/// </summary>
/// <returns></returns>
DataTable GetAllInfo();
#endregion
#region 按条件查询信息
/// <summary>
/// 按条件查询信息
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
DataTable GetInfoByQuery(string strCtiyId, string strBusiType);
#endregion
#region 按条件查询信息,并用于导出
/// <summary>
/// 按条件查询信息,并用于导出
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
DataTable QueryInfoForDowland(string strCtiyId, string strBusiType);
#endregion
#region 删除一条信息
/// <summary>
/// 删除一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
bool DelOneInfo(string strIntId);
#endregion
#region 修改一条数据
/// <summary>
/// 修改一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
bool UpDateOneInfo(T t);
#endregion
}
}
上面是一个接口类,下面是各个专业的信息的处理类。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace 简单工厂
{
public class BtsSite<BtsSiteManagerDomain> : ISpeciality<BtsSiteManagerDomain> where BtsSiteManagerDomain:IDomain
{
public BtsSite()
{
}
#region 新增一条数据
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
public bool InserOneInfo(BtsSiteManagerDomain btsSiteManagerDomain)
{
btsSiteManagerDomain.Intid = "111";
bool bRet = false;
return bRet;
}
#endregion
#region 得到一条信息
/// <summary>
/// 得到一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
public DataTable GetOneInfo(string strIntId)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 得到所有信息
/// <summary>
/// 得到所有信息
/// </summary>
/// <returns></returns>
public DataTable GetAllInfo()
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 按条件查询信息
/// <summary>
/// 按条件查询信息
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
public DataTable GetInfoByQuery(string strCtiyId, string strBusiType)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 按条件查询信息,并用于导出
/// <summary>
/// 按条件查询信息,并用于导出
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
public DataTable QueryInfoForDowland(string strCtiyId, string strBusiType)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 删除一条信息
/// <summary>
/// 删除一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
public bool DelOneInfo(string strIntId)
{
bool bRet = false;
return bRet;
}
#endregion
#region 修改一条数据
/// <summary>
/// 修改一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
public bool UpDateOneInfo(BtsSiteManagerDomain btsSiteManagerDomain)
{
bool bRet = false;
return bRet;
}
#endregion
}
}
然后可以在定义其他专业的信息处理类。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace 简单工厂
{
class Asite<AsiteDomain>:ISpeciality<AsiteDomain> where AsiteDomain:IDomain
{
public Asite()
{
}
#region 新增一条数据
/// <summary>
/// 新增一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
public bool InserOneInfo(AsiteDomain asiteDomain)
{
asiteDomain.Intid = "111";
bool bRet = false;
return bRet;
}
#endregion
#region 得到一条信息
/// <summary>
/// 得到一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
public DataTable GetOneInfo(string strIntId)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 得到所有信息
/// <summary>
/// 得到所有信息
/// </summary>
/// <returns></returns>
public DataTable GetAllInfo()
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 按条件查询信息
/// <summary>
/// 按条件查询信息
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
public DataTable GetInfoByQuery(string strCtiyId, string strBusiType)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 按条件查询信息,并用于导出
/// <summary>
/// 按条件查询信息,并用于导出
/// </summary>
/// <param name="strCtiyId">地市id</param>
/// <param name="strBusiType">专业类型1为话务2 为传输3 为动环4为数据</param>
/// <returns></returns>
public DataTable QueryInfoForDowland(string strCtiyId, string strBusiType)
{
DataTable tempTable = new DataTable();
return tempTable;
}
#endregion
#region 删除一条信息
/// <summary>
/// 删除一条信息
/// </summary>
/// <param name="strIntId"></param>
/// <returns></returns>
public bool DelOneInfo(string strIntId)
{
bool bRet = false;
return bRet;
}
#endregion
#region 修改一条数据
/// <summary>
/// 修改一条数据
/// </summary>
/// <param name="t">数据对象</param>
/// <returns></returns>
public bool UpDateOneInfo(AsiteDomain asiteDomain)
{
bool bRet = false;
return bRet;
}
#endregion
}
}
最后,一个按需求实列对象的类。
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public sealed class Createor<T> where T:IDomain
{
public static ISpeciality<T> CreaterSpeciality(string strKey)
{
switch(strKey)
{
case "BtsSite":
return new BtsSite<T>();
break;
case "Asite":
return new Asite<T>();
break;
default:
return new BtsSite<T>();
break;
}
}
}
}
该模式,能够根据传入参数的不同,返回不同的类的实列,但是,返回的类的实例都是在工厂类里面定义好的,对于后期的新的类的实例,不能够满足。
正如本系统中,现阶段没有数据专业,那以后添加数据专业的时候,还要修改该工厂类。按照开_闭原则,对修改关闭,对扩展开放,因此,我们不可能在对该工厂类做修改。那如果对于以后新需求的增加,怎么才能够满足呢?
我们可不可以在最初设计这个Createor类的时候,设计成这样的呢?
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public interface ICreator<T> where T : IDomain
{
ISpeciality<T> CreaterSpeciality(string strKey);
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public class Createor<T> :ICreator<T> where T : IDomain
{
public virtual ISpeciality<T> CreaterSpeciality(string strKey)
{
switch (strKey)
{
case "BtsSite":
return new BtsSite<T>();
break;
default:
return new BtsSite<T>();
break;
}
}
}
}及,以后如果有新的需求的增加,我们只需要在写个类,从Createor类继承。
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public class AddCreator<T> : Createor<T> where T : IDomain
{
public override ISpeciality<T> CreaterSpeciality(string strKey)
{
switch (strKey)
{
case "Asite":
return new Asite<T>();
break;
default:
return new Asite<T>();
break;
}
}
}
}
然后,在使用的时候,使用下面的方法:
AsiteDomain asiteDomain = new AsiteDomain();
ICreator<IDomain> creator = new Createor<IDomain>();
ISpeciality<IDomain> speciality = creator.CreaterSpeciality("BtsSite");
speciality.InserOneInfo(asiteDomain);
而不 是 使用:
AsiteDomain asiteDomain = new AsiteDomain();
ISpeciality<IDomain> speciality = Createor<IDomain> .CreaterSpeciality("BtsSite");
speciality.InserOneInfo(asiteDomain);
按照这样的修改,显然能够可以在不违背关—闭原则的前提下,做到对新功能的增加。
但是,按照这样的修改,该模式,已经接近 工厂方法模式。
请看下一节:工厂方法模式。
最后,付上完全代码;
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public interface IDomain
{
string Intid
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public class BtsSiteManagerDomain : IDomain
{
private string mIntId;
public string Intid
{
get
{
return mIntId;
}
set
{
mIntId = value;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace 简单工厂
{
public class AsiteDomain : IDomain
{
private string mIntId;
public string Intid
{
get
{
return mIntId;
}
set
{
mIntId = value;
}
}
}
}
有事Q我:
姓名:颜昌钢
联系方式:yanchanggang@boco.com.cn
电话:13886086508
QQ:95550107
公司:亿阳集团武汉分公司
移动飞信:647360243