Niceri

导航

C# 抽象工厂模式

抽想工厂类创建方法,以下是一个多年前写的例子

1,提供一个供外部访问的属性

2,构造函数初始化该属性

3,创建子类工厂需要继承实现的业务类的属性

 public abstract class BLLFactory
 {
        public static BLLFactory Instance { get; private set; }
        static BLLFactory()
        {
            string typeName = ConfigurationManager.AppSettings["BLL"];//配置文件中BLL的值为HomeFactory
            Type t = Type.GetType(typeName, true, true);
            object obj = Activator.CreateInstance(t);
            Instance = (BLLFactory)obj;
        }
        //用户管理模块业务的接口
        public abstract IUserBLL UserBLL { get; }

        //其他模块业务的接口
        public abstract IOtherBLL OtherBLL { get; }

      //....
}

 

4,IUserBLL 接口实现

    public interface IUserBLL
    {
        /// <summary>
        /// 账号注册
        /// </summary>
        /// <param name="user">用户基本信息</param>
        /// <returns>注册是否成功</returns>
        bool Register(UserDTO user);

        /// <summary>
        /// 账号登陆
        /// </summary>
        /// <param name="user">账号/密码</param>
        /// <param name="ds">用户基本信息</param>
        /// <returns>登录是否成功</returns>        
        bool Login(UserDTO user, ref DataTable dt);
    }

5,子类工厂 HomeFactory 实现

 public class HomeFactory : BLLFactory
 {
        public override IUserBLL UserBLL
        {
            get 
            { 
                return new UserBLL(); 
            }
        }
        public override IOtherBLL OtherBLL
        {
            get 
            { 
                return new OtherBLL(); 
            }
        }
        //...
   }

 

6,UserBLL实现IUserBLL接口方法

    public class UserBLL:IUserBLL
    {
        #region IUserBLL 成员

        bool IUserBLL.Register(UserDTO user)
        {
             //代码实现逻辑
        }

        bool IUserBLL.Login(UserDTO user, ref DataTable dt)
        {
             //代码实现逻辑
        }

        #endregion
    }

7,IOtherBLL,OtherBLL可参考上面的 IUserBLL,UserBLL实现

这样实现的意义在于,可根据配置文件的设置灵活使用不同的BLLFactory实现工厂,就像是A工厂和B工厂他们都生产自行车,但A工厂和B工厂使用的配件和组装方法不一样

而我们的业务逻辑可能是A工厂使用sqlserver数据库,而B工厂使用Oracle数据库,但是都能实现获取业务数据的需求

8,调用方法

bool isOK = BLLFactory.Instance.UserDLL.Register(userDTO);

 

posted on 2017-06-21 11:03  Niceri  阅读(217)  评论(0编辑  收藏  举报