设计模式 之 简单工厂

来源:互联网 发布:凯立德端口怎么看 编辑:程序博客网 时间:2024/04/29 09:15

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

    }
}

原创粉丝点击