設計模式 之 簡單工廠

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

    }
}

發佈了38 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章