一个例子演示三种类工厂模式


先来段起始源码:

需求是: 使用SQLServer数据库,对表User进行Insert和GetUser两个操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlserverUser sql = new SqlserverUser();
            sql.Insert(new User() { ID = 1, Name = "张三" });
            sql.GetUser(1);

            Console.ReadKey();
        }
    }

    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }


    public class SqlserverUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("SQL Server给User表插入一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("SQL Server根据ID得到User表一条记录");
            return null;
        }
    }



}


然后客户改了需求了。

要求即可以使用SQLServer,也可以使用Access数据库。


下面是勇哥实现的简单类工厂方式。

类图如下:

image.png

源码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication17
{
    class Program
    {
        static void Main(string[] args)
        {
            UserOperateFac fac = new UserOperateFac();
            var obj= fac.GetObj(UserOperEnum.Access);
            obj.Insert(new User() { ID=1, Name="张三" });
            var s1= obj.GetUser(1);

            Console.ReadKey();
        }
    }

    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    public class SqlserverUser: UserOperate
    {
        public override void Insert(User user)
        {
            Console.WriteLine("SQL Server给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("SQL Server根据ID得到User表一条记录");
            return null;
        }
    }

    public class AccessUser : UserOperate
    {
        public override void Insert(User user)
        {
            Console.WriteLine("Access给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("Access根据ID得到User表一条记录");
            return null;
        }
    }



    public abstract class UserOperate
    {
        public abstract void Insert(User user);


        public abstract User GetUser(int id);
    }

    public enum UserOperEnum
    {
        SQLServer,Access
    }

    public class UserOperateFac
    {
        UserOperate res = null;
        public UserOperate GetObj(UserOperEnum op)
        {
            switch(op)
            {
                case UserOperEnum.SQLServer:
                    res = new SqlserverUser();
                    break;
                case UserOperEnum.Access:
                    res = new AccessUser();
                    break;
            }
            return res;
        }

    }

}


下面是实现的工厂模式


类图如下:

image.png


源码如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            RootFactory fac = new SqlserverUserFac();
            var obj= fac.CreateOperaObj();
            obj.Insert(new User() {ID=1, Name="q1" });
            obj.GetUser(1);
            Console.ReadKey();
        }

    }

    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }



    public class SqlserverUser:UserOpera
    {
        public override void Insert(User user)
        {
            Console.WriteLine("SQL Server给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("SQL Server根据ID得到User表一条记录");
            return null;
        }
    }

    public class AccessUser : UserOpera
    {
        public override void Insert(User user)
        {
            Console.WriteLine("Access给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("Access根据ID得到User表一条记录");
            return null;
        }
    }


    public abstract class UserOpera
    {
        public abstract void Insert(User user);

        public abstract User GetUser(int id);
    }

    public abstract class RootFactory
    {
        public abstract UserOpera CreateOperaObj();
    }

    public class SqlserverUserFac : RootFactory
    {
        public override UserOpera CreateOperaObj()
        {
            return new SqlserverUser();
        }
    }

    public class AccessUserFac : RootFactory
    {
        public override UserOpera CreateOperaObj()
        {
            return new AccessUser();
        }
    }


}


现在需要变化了。

原来只有一个表User需要操作,现在我们还需要操作“部门”表。

这样出现了“多种产品系列”的问题。


下面是抽象工厂模式的演示:


类图:

image.png


源码:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    //抽象工厂

    class Program
    {
        static void Main(string[] args)
        {
            IFactory fac = new SqlserverFactory();
            var op= fac.CreateUser();
            op.Insert(new User() { ID=1, Name="张三"});
            op.GetUser(1);
            Console.ReadKey();
        }

    }

    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    public class 部门
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }


    public class SqlserverUser:UserOpera
    {
        public override void Insert(User user)
        {
            Console.WriteLine("SQL Server给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("SQL Server根据ID得到User表一条记录");
            return null;
        }
    }

    public class AccessUser : UserOpera
    {
        public override void Insert(User user)
        {
            Console.WriteLine("Access给User表插入一条记录");
        }

        public override User GetUser(int id)
        {
            Console.WriteLine("Access根据ID得到User表一条记录");
            return null;
        }
    }


    public class Sqlserver部门 : 部门Opera
    {
        public override void Insert(部门 user)
        {
            Console.WriteLine("SQL Server给User表插入一条记录");
        }

        public override 部门 GetUser(int id)
        {
            Console.WriteLine("SQL Server根据ID得到User表一条记录");
            return null;
        }
    }

    public class Access部门 : 部门Opera
    {
        public override void Insert(部门 user)
        {
            Console.WriteLine("Access给User表插入一条记录");
        }

        public override 部门 GetUser(int id)
        {
            Console.WriteLine("Access根据ID得到User表一条记录");
            return null;
        }
    }




    public abstract class UserOpera
    {
        public abstract void Insert(User user);

        public abstract User GetUser(int id);
    }

    public abstract class 部门Opera
    {
        public abstract void Insert(部门 user);

        public abstract 部门 GetUser(int id);
    }


    public interface IFactory
    {
        UserOpera CreateUser();
        部门Opera Create部门();
    }


    public class SqlserverFactory : IFactory
    {
        public UserOpera CreateUser()
        {
            return new SqlserverUser();
        }

        public 部门Opera Create部门()
        {
            return new Sqlserver部门();
        }
    }

    public class AccessFactory : IFactory
    {
        public UserOpera CreateUser()
        {
            return new AccessUser();
        }

        public 部门Opera Create部门()
        {
            return new Access部门();
        }
    }



}


描述抽象工厂的结构图:

image.png



下面是用简单工厂改造后的抽象工厂代码:

主要改进是中需要修改dbStr这个枚举,就可以快速切换数据库类型。

避免多次调用下面的代码。

image.png


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication18
{
    class Program
    {

        private const SQLEnum dbStr = SQLEnum.Access; 
        


        public enum SQLEnum
        {
            Access, SQLServer
        }

        static void Main(string[] args)
        {
            //RootFactory fac = new AccessUserFactory();
            //var sql = fac.Create部门();


            var sql = DataAccess.Create部门();
            sql.Insert(new 部门() { ID = 1, Name = "张三" });
            sql.GetUser(1);

            Console.ReadKey();
        }


        public class DataAccess
        {

            public static UserOpera CreateUser()
            {
                UserOpera res = null;
                switch (dbStr)
                {
                    case SQLEnum.SQLServer:
                        res = new SqlserverUser();
                        break;
                    case  SQLEnum.Access:
                         res = new AccessUser();
                        break;
                }
                return res;
            }

            public static 部门Opera Create部门()
            {
                部门Opera res = null;
                switch (dbStr)
                {
                    case SQLEnum.SQLServer:
                        res = new Sqlserver部门();
                        break;
                    case SQLEnum.Access:
                        res = new Access部门();
                        break;
                }
                return res;
            }
        }


        public class User
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }

        public class 部门
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }


        public class SqlserverUser: UserOpera
        {
            public override void Insert(User user)
            {
                Console.WriteLine("SQL Server给User表插入一条记录");
            }

            public override User GetUser(int id)
            {
                Console.WriteLine("SQL Server根据ID得到User表一条记录");
                return null;
            }
        }

        public class AccessUser : UserOpera
        {
            public override void Insert(User user)
            {
                Console.WriteLine("Access给User表插入一条记录");
            }

            public override User GetUser(int id)
            {
                Console.WriteLine("Access根据ID得到User表一条记录");
                return null;
            }
        }


        public class Sqlserver部门 : 部门Opera
        {
            public override void Insert(部门 user)
            {
                Console.WriteLine("SQL Server给部门表插入一条记录");
            }

            public override 部门 GetUser(int id)
            {
                Console.WriteLine("SQL Server根据ID得到部门表一条记录");
                return null;
            }
        }

        public class Access部门 : 部门Opera
        {
            public override void Insert(部门 user)
            {
                Console.WriteLine("Access给部门表插入一条记录");
            }

            public override 部门 GetUser(int id)
            {
                Console.WriteLine("Access根据ID得到部门表一条记录");
                return null;
            }
        }

        public abstract class UserOpera
        {
            public abstract void Insert(User user);

            public abstract User GetUser(int id);

        }

        public abstract class 部门Opera
        {
            public abstract void Insert(部门 user);

            public abstract 部门 GetUser(int id);

        }


        public class AccessUserFactory: RootFactory
        {
            public override UserOpera CreateUser()
            {
                return new AccessUser();
            }

            public override 部门Opera Create部门()
            {
                return new Access部门();
            }
        }

        public class SqlserverUserFactory: RootFactory
        {
            public override UserOpera CreateUser()
            {
                return new SqlserverUser();
            }
            public override 部门Opera Create部门()
            {
                return new Sqlserver部门();
            }
        }

     

        public abstract class RootFactory
        {
            public abstract UserOpera CreateUser();
            public abstract 部门Opera Create部门();
        }


    }
}



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-23 14:24:04 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864