買了《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;
}
}
}
}