抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例

1.App.config文件配置

<configuration>
  <appSettings>
    <add key="yoyo" value="OperateEmployeesDB"/>
  </appSettings>
</configuration>

 

2.调用

       static void Main(string[] args)
        {
            /*注意此处,和工厂方法一样,当需要使用哪个操作类时,就实例化对应
             * 操作类的工厂类。
             * 更灵活的方式是将创建  OperateEmployeesFactory()  的具体操作类
             * 的命令配置到外部文件中
*/
            //IAbstractFactory abstractFactory = new OperateEmployeesFactory();
            //IOperateDB OperateDB = abstractFactory.CreateIOperateDB();

            //工厂方法替换抽象工厂
            //string cmd = "OperateEmployeesFactory";
            //IOperateDB operateDB = DataAccessFactory.SelectOperateDB(cmd);


            //此处调用配置文件,再加上反射,性能虽有损耗,但代码简洁灵活多了
            string cmd = ConfigurationManager.AppSettings["yoyo"];
            IOperateDB operateDB = DataAccessFactoryEx.CreateOperateDB(cmd);
            Console.WriteLine(operateDB.InsertDB());
        }

 

3.工厂类

namespace Data
{
    /// <summary>
    /// 使用工厂方法替换掉抽象工厂
    /// </summary>
    public class DataAccessFactory
    {
        static IOperateDB operateDB;

        public static IOperateDB SelectOperateDB(string cmd)
        {
            switch (cmd)
            {
                case "OperateEmployeesFactory":
                    operateDB = new OperateEmployeesDB();
                    break;
                case "OperateCustomersFactory":
                    operateDB = new OperateCustomersDB();
                    break;
            }
            return operateDB;
        }
    }

    /// <summary>
    /// 使用反射创建对象实例
    /// </summary>
    public class DataAccessFactoryEx
    {
        static IOperateDB operateDB;

        public static IOperateDB CreateOperateDB(string cmd)
        {
            operateDB = (IOperateDB)Assembly.Load("Data").CreateInstance("Data." + cmd);
            return operateDB;
        }
    }

    /// <summary>
    /// 抽象工厂模式可工厂方法模式的区别在于:抽象工厂中面临多种类型的数据操作类
    /// 的创建。但是这样做就引起了各个具体工程类的耦合。
    /// </summary>
    public interface IAbstractFactory
    {
        IOperateDB CreateIOperateDB();
        IOperateDBEx CreateIOperateDBEx();
    }

    public class OperateEmployeesFactory : IAbstractFactory
    {
        #region IAbstractFactory 成员

        public IOperateDB CreateIOperateDB()
        {
            return new OperateEmployeesDB();
        }

        #endregion

        #region IAbstractFactory 成员


        public IOperateDBEx CreateIOperateDBEx()
        {
            return new OperateEmployeesDBEx();
        }

        #endregion
    }

    public class OperateCustomersFactory : IAbstractFactory
    {
        #region IAbstractFactory 成员

        public IOperateDB CreateIOperateDB()
        {
            return new OperateCustomersDB();
        }

        #endregion

        #region IAbstractFactory 成员


        public IOperateDBEx CreateIOperateDBEx()
        {
            return new OperateCustomersDBEx();
        }

        #endregion
    }
}

 

4.具体工作类

namespace Data
{
    /// <summary>
    /// 数据操作的功能抽象
    /// </summary>
    public interface IOperateDB
    {
        string InsertDB();
        string UpdateDB();
        string DelDB();
    }

    /// <summary>
    /// 返回列表的操作单独形成一个类
    /// </summary>
    public interface IOperateDBEx
    {
        List<string> GetDataList();
    }

    public class OperateEmployeesDB : IOperateDB
    {
        public string InsertDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Employees e = new Employees();
            e.LastName = "yoyozhu";
            e.FirstName = "zhushao";
            db.AddToEmployees(e);
            db.SaveChanges();
            return "添加数据成功";
        }

        public string UpdateDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Employees e = db.Employees.Where(c => c.EmployeeID == 44).FirstOrDefault();
            db.DeleteObject(e);
            db.SaveChanges();
            return "删除数据成功";
        }

        public string DelDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Employees e = db.Employees.Where(c => c.EmployeeID == 44).FirstOrDefault();
            e.LastName = "chuanshi_yoyo";
            db.SaveChanges();
            return "修改数据成功";
        }

    }

    public class OperateCustomersDB : IOperateDB
    {
        public string InsertDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Customers e = new Customers();
            e.ContactName = "yoyozhu";
            e.CompanyName = "zhushao";
            db.AddToCustomers(e);
            db.SaveChanges();
            return "添加数据成功";
        }

        public string UpdateDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Customers e = db.Customers.Where(c => c.CompanyName == "zhushao").FirstOrDefault();
            db.DeleteObject(e);
            db.SaveChanges();
            return "删除数据成功";
        }

        public string DelDB()
        {
            NorthwindEntities db = new NorthwindEntities();
            Customers e = db.Customers.Where(c => c.CompanyName == "zhushao").FirstOrDefault();
            db.DeleteObject(e);
            db.SaveChanges();
            return "删除数据成功";
        }
    }

    public class OperateEmployeesDBEx : IOperateDBEx
    {
        #region IOperateDBEx 成员

        public List<string> GetDataList()
        {
            List<string> list = new List<string>();
            NorthwindEntities db = new NorthwindEntities();
            var query = from q in db.Employees select q.LastName;
            foreach (var str in query)
                list.Add(str);

            return list;
        }

        #endregion
    }

    public class OperateCustomersDBEx : IOperateDBEx
    {
        #region IOperateDBEx 成员

        public List<string> GetDataList()
        {
            List<string> list = new List<string>();
            NorthwindEntities db = new NorthwindEntities();
            var query = from q in db.Customers select q.CompanyName;
            foreach (var str in query)
                list.Add(str);

            return list;
        }

        #endregion
    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值