根据业务自己设计的.NET工厂模式架构

最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构

项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有appid来区分)

因为每个平台的业务处理几乎不一样,而属于同一个平台的app客户端业务又几乎一样,但也有要特殊情况处理的。

直接代码展示:

首先是接口和抽象类

    /// <summary>
    /// 商品接口类
    /// </summary>
    public interface IProductBLL
    {
        string GetBLLName(int appid);

        string GetAction();
    }

    /// <summary>
    /// 抽象类
    /// </summary>
    public abstract class BaseProductBLL : IProductBLL
    {

        public static IProductBLL GetProductBll(int appid)
        {
            //定义appid属于哪个平台,这里可以用config配置或者枚举定义
            int[] A_appid = new int[] {10001,10003,10005 };
            int[] B_appid = new int[] { 10002, 10004, 10006 };
            int[] C_appid = new int[] { 10007, 10008, 100009 };
            IProductBLL bll = null;

            if (A_appid.Contains(appid))//此appid属于A平台
            {
                bll = BaseProduct_A_BLL.GetProductBll(appid);
            }
            else if (B_appid.Contains(appid))//此appid属于B平台
            {
                bll = BaseProduct_B_BLL.GetProductBll(appid);
            }
            else if (C_appid.Contains(appid))//此appid属于C平台
            {
                bll = BaseProduct_C_BLL.GetProductBll(appid);
            }

            return bll;
        }

        public abstract string GetBLLName(int appid);
        public abstract string GetAction();
    }

接下来是各平台的通用类

    /// <summary>
    /// A平台通用类
    /// </summary>
    public class BaseProduct_A_BLL : BaseProductBLL
    {
        private static IProductBLL _instanceA = null;
        public static IProductBLL InstanceA
        {
            get
            {
                if (_instanceA == null)
                {

                    _instanceA = new BaseProduct_A_BLL();
                }
                return _instanceA;
            }
        }
        public static IProductBLL GetProductBll(int appid)
        {
            IProductBLL bll = null;

            switch (appid)
            { 
                case 10003:
                    bll=Product_10003_BLL.Instance10003;
                    break;
                default:
                    bll = BaseProduct_A_BLL.InstanceA;
                    break;
            }

            return bll;
        }

        public override string GetBLLName(int appid)
        {
            return "" + appid + "调用了BaseProduct_A_BLL.GetBLLName";
        }

        public override string GetAction()
        {
            return "调用了BaseProduct_A_BLL.GetAction";
        }

    }

    /// <summary>
    /// B平台通用类
    /// </summary>
    public class BaseProduct_B_BLL : BaseProductBLL
    {
        private static IProductBLL _instanceB = null;
        public static IProductBLL InstanceB
        {
            get
            {
                if (_instanceB == null)
                {

                    _instanceB = new BaseProduct_B_BLL();
                }
                return _instanceB;
            }
        }
        public static IProductBLL GetProductBll(int appid)
        {
            IProductBLL bll = null;

            switch (appid)
            {
                default:
                    bll = BaseProduct_B_BLL.InstanceB;
                    break;
            }

            return bll;
        }

        public override string GetBLLName(int appid)
        {
            return "" + appid + "调用了BaseProduct_B_BLL.GetBLLName";
        }

        public override string GetAction()
        {
            return "调用了BaseProduct_B_BLL.GetAction";
        }

    }

    /// <summary>
    /// C平台通用类
    /// </summary>
    public class BaseProduct_C_BLL : BaseProductBLL
    {
        private static IProductBLL _instanceC = null;
        public static IProductBLL InstanceC
        {
            get
            {
                if (_instanceC == null)
                {

                    _instanceC = new BaseProduct_C_BLL();
                }
                return _instanceC;
            }
        }
        public static IProductBLL GetProductBll(int appid)
        {
            IProductBLL bll = null;

            switch (appid)
            {
                default:
                    bll = BaseProduct_C_BLL.InstanceC;
                    break;
            }

            return bll;
        }

        public override string GetBLLName(int appid)
        {
            return "" + appid + "调用了BaseProduct_C_BLL.GetBLLName";
        }

        public override string GetAction()
        {
            return "调用了BaseProduct_C_BLL.GetAction";
        }
    }

假如appid为10003的需要拓展,需在A平台通用类中添加case 10003 的逻辑,并创建对应的拓展类Product_10003_BLL并继承A平台通用类BaseProduct_A_BLL

    /// <summary>
    /// appid为10003拓展类
    /// </summary>
    public class Product_10003_BLL : BaseProduct_A_BLL
    {
        private static IProductBLL _instance10003 = null;
        public static IProductBLL Instance10003
        {
            get
            {
                if (_instance10003 == null)
                {

                    _instance10003 = new Product_10003_BLL();
                }
                return _instance10003;
            }
        }

        public Product_10003_BLL()
        { 
        }

        public override string GetBLLName(int appid)
        {
            return "" + appid + "调用了Product_10003_BLL.GetBLLName";
        }
    }

如上appid为10003的拓展类重写了GetBLLName方法。

接下来就是在Controlle层中调用

    /// <summary>
    /// 基类控制类
    /// </summary>
    public class BasesController : Controller
    {
        public BasesController()
        { 
        }

        protected int Appid
        {
            get { return Convert.ToInt32(HttpContext.Request["appid"]); }
        }

        public IProductBLL ProductBll
        {
            get
            {
                return BaseProductBLL.GetProductBll(Appid);
            }
        }
    }

    public class ProductController : BasesController
    {
        //
        // GET: /Product/
        public ActionResult Index()
        {
            string bllname = ProductBll.GetBLLName(Appid);
            string actionName = ProductBll.GetAction();
            ViewData["bllname"] = bllname;
            ViewData["actionName"] = actionName;
            return View();
        }

    }

以上参数appid是必传,以上代码没有对不传参数且参数值得正确性做判断的异常处理,这里主要是记录对于这个系统的交互设计,另外数据访问层DAL也没有写出来,可以按照上面的设计思路进行创建

下面是我简单测试打印出来的

ViewData["bllname"] 
ViewData["actionName"] 的值

访问http://localhost:37842/product/index?appid=10005

也就是参数appid为10005 时打印出 :

10005调用了BaseProduct_A_BLL.GetBLLName

调用了BaseProduct_A_BLL.GetAction

当appid为10003时打印出:

10003调用了Product_10003_BLL.GetBLLName

调用了BaseProduct_A_BLL.GetAction

当appid为10002时打印出:

10002调用了BaseProduct_B_BLL.GetBLLName

调用了BaseProduct_B_BLL.GetAction

此文仅记录笔记,各位大神可以多多指教!

原文地址:https://www.cnblogs.com/gangtienanzi/p/5413944.html