豪仕知识网--知识就是力量!

微信
手机版
生活常识

使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码),数据库手机号码sql语句

作者 :耶律楚材 2024-01-02 16:30:05 围观 : 评论

使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码),数据库手机号码sql语句

豪士君测试所用平台

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

现在还有好多人不知道使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码),接下来我们小编就来分享一下。

2010年4月3日使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)

关于工厂模式

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

先讲一下简单工厂模式、工厂方法模式、抽象工厂模式的东西:

简单工厂模式(Simple Factory Pattern):工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,也就是说产品的创建逻辑集中于一个工厂类,客户端只需要传递不同的参数给工厂,这时情况是:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂;对于客户端来说,不存在与具体产品的依赖; 工厂方法模式(Factory Method Pattern):提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现; 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系统或相互依赖对象的接口,不需要指定具体类。抽象工厂正如其名字所说,它抽象的是工厂接口,因此它面向的是多个平等等级结构,其建立对象的原则是以功能相似的对象为单位划分需要建立的对象。

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

简单工厂并不属于23种基本设计模式中,它是抽象工厂模式的一个特例;抽象工厂与工厂方法区别在于它们抽象的对象不同:工厂方法针对产品进行抽象,而抽象工厂抽象针对工厂。因此可以认为工厂方法是抽象工厂的一种极端情况,工厂方法模式用来创建一个产品的等级结构,它一般只有一个方法,创建一种产品;而抽象工厂是用来创建多个产品的等级结构,一般有多个方法,创建一系列产品。

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

手机号码查询设计

此程序主要功能就是根据手机号码段查询相应的号码归属地。数据来自网络,数据表结构如下

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

数据记录超过17万条

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

这里我使用了Sqlite数据库,将此数据库文件转换为Sqlite数据库文件。

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

主程序界面设计如下:

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

业务逻辑分析

主程序调用业务逻辑层BLL,BLL使用抽象工厂DALFactory方法,DALFactory创建DAO实例对象,接口层IDAL定义数据操作接口方法,由数据访问层通过各自的公用数据操作类库进行读写数据库,实现对实体类Model的访问。

解决方案文件列表如图

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

其中DBUtility为公共数据访问类库。三个数据访问层SQLServerDAL、SqliteDAL和OleDAL分别对应sql server、Sqlite、Access数据库。这里我正在使用的是SqliteDAL。

具体实现

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

建立实体类进行对象封装

App.config定义选用的DAL及数据库连接信息

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

代码

<?xml version="1.0" encoding="utf-8" ?>                            SqlConnStr.cs文件用于获得相应的连接字符串ConnectionString

代码

/// /// 获得连接字符串ConnectingString/// public static class SqlConnString{    public static string ReturnConnString()    {        string _appPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//当前程序路径        string _dal = System.Configuration.ConfigurationManager.AppSettings["DAL"];//获取App.Config中DAL        string _conn = "";        switch (_dal)        {            /*Sqlite数据库*/            case "CuteMobileSearch.SQLiteDAL":            default:                _appPath = "Data Source=" + _appPath;                _appPath += System.Configuration.ConfigurationManager.AppSettings["SqliteFile"];                return _appPath;            /*SqlServer数据库*/            case "CuteMobileSearch.SQLServerDAL":                _conn = "server=.;database=CuteMobileDB;uid=sa;pwd=123456";                return _conn;            /*access数据库*/            case "CuteMobileSearch.OleDAL":                _appPath = "provider=microsoft.jet.oledb.4.0;data source=" + _appPath + System.Configuration.ConfigurationManager.AppSettings["OleFile"];                return _appPath;        }    }}

然后是抽象工厂DAL通过使用反射创建接口对象的实例

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

代码

/// /// 创建抽象工厂/// public sealed class ObjectCreate{    /*所使用程序集*/    public static readonly string asseblyDAL = System.Configuration.ConfigurationManager.AppSettings["DAL"];    ///     /// 创建对象(不使用缓存:B/S使用)    ///     ///     ///     ///     private static object CreateObject(string AssemblyPath, string classNamespace)    {        try        {            object objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);            return objType;        }        catch        {            return null;        }    }    ///     /// 创建list接口对象    ///     ///     public static CuteMobileSearch.IDAL.Ilist CreateListObj()    {        string className = asseblyDAL + ".listServices";        object obj = CreateObject(asseblyDAL, className);        return (CuteMobileSearch.IDAL.Ilist)obj;    }}

IDAL声明数据访问的接口方法

代码 public interface Ilist{ /*添加对象*/ int Add(CuteMobileSearch.Model.list objList); /*返回所有*/ List GetAll(); /*根据号码查询*/ List GetListByNum(string num); /*根据查询条件*/ List GetListByWhere(string strWhere);}

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

SqliteDAL继承IDAL,实现对数据库的访问和操作,来访问实体类Model

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

代码

/// /// 基于Sqlite的数据访问类库/// public class listServices : IDAL.Ilist{    ///     /// 添加    ///     /// 返回添加数目    public int Add(CuteMobileSearch.Model.list objList)    {        StringBuilder sbSql = new StringBuilder();        sbSql.Append("INSERT INTO list(");        sbSql.Append("num,code,city,cardtype)");        sbSql.Append(" VALUES(");        sbSql.Append("@num,@code,@city,@cardtype)");        sbSql.Append(";SELECT @@IDENTITY");        SQLiteParameter[] paras ={            new SQLiteParameter("@num",DbType.String,8),            new SQLiteParameter("@code",DbType.String,8),            new SQLiteParameter("@city",DbType.String,16),            new SQLiteParameter("@cardtype",DbType.String,16)        };        paras[0].Value = objList.Num;        paras[1].Value = objList.Code;        paras[2].Value = objList.City;        paras[3].Value = objList.Cardtype;        int num = Wang.DBUtility.SqliteHelper.ExecuteCommand(sbSql.ToString());        return num;    }    ///     /// 返回List    ///     ///     public List GetAll()    {        return GetListByWhere("");    }    ///     /// 根据号码查询    ///     ///     ///     public List GetListByNum(string num)    {        string strWhere = "num LIKE '" + num + "%'";        return GetListByWhere(strWhere);    }    ///     /// 根据条件返回List    ///     ///     ///     public List GetListByWhere(string strWhere)    {        List listList = new List();        StringBuilder strSql = new StringBuilder();        strSql.Append("SELECT * FROM list");        if (strWhere != "")        {            strSql.Append(" WHERE ");            strSql.Append(strWhere);        }        SQLiteDataReader reader = Wang.DBUtility.SqliteHelper.GetReader(strSql.ToString());        while (reader.Read())        {            CuteMobileSearch.Model.list objList = new CuteMobileSearch.Model.list();            if (reader["id"].ToString() != String.Empty)            {                objList.Id = int.Parse(reader["id"].ToString());            }            objList.Num = reader["num"].ToString();            objList.Code = reader["code"].ToString();            objList.City = reader["city"].ToString();            objList.Cardtype = reader["cardtype"].ToString();            listList.Add(objList);        }        reader.Close();        return listList;    }}
◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

以其中的查询结果的GetListByNum方法的UML类图如下

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

运行结果

主程序运行效果如下图

查看详细信息

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

总结

此类基于多数据库操作的应用程序是很常见的,通过使用工厂方法模式进行架构,以业务逻辑分层、抽象实现数据访问的思想进行开发,显然在程序的可扩展性、层次性具有较大的优势。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

另一点值得说的是,Sqlite数据库的确在一些应用场合中具有较大的优势,关于Sqlite数据库的介绍请参见此文http://zh.wikipedia.org/wiki/SQLite

废话

我知道这篇文章技术一般,显然达不到cnblogs的技术层次;我本人的技术水平在cnblogs牛人面前也只是小菜鸟而已,发到首页是希望大家多多拍砖,多提宝贵意见,:)

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

2010年4月3日使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

关于工厂模式

先讲一下简单工厂模式、工厂方法模式、抽象工厂模式的东西:

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

简单工厂模式(Simple Factory Pattern):工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,也就是说产品的创建逻辑集中于一个工厂类,客户端只需要传递不同的参数给工厂,这时情况是:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂;对于客户端来说,不存在与具体产品的依赖; 工厂方法模式(Factory Method Pattern):提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现; 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系统或相互依赖对象的接口,不需要指定具体类。抽象工厂正如其名字所说,它抽象的是工厂接口,因此它面向的是多个平等等级结构,其建立对象的原则是以功能相似的对象为单位划分需要建立的对象。

简单工厂并不属于23种基本设计模式中,它是抽象工厂模式的一个特例;抽象工厂与工厂方法区别在于它们抽象的对象不同:工厂方法针对产品进行抽象,而抽象工厂抽象针对工厂。因此可以认为工厂方法是抽象工厂的一种极端情况,工厂方法模式用来创建一个产品的等级结构,它一般只有一个方法,创建一种产品;而抽象工厂是用来创建多个产品的等级结构,一般有多个方法,创建一系列产品。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

手机号码查询设计

此程序主要功能就是根据手机号码段查询相应的号码归属地。数据来自网络,数据表结构如下

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

数据记录超过17万条

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

这里我使用了Sqlite数据库,将此数据库文件转换为Sqlite数据库文件。

主程序界面设计如下:

业务逻辑分析

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

主程序调用业务逻辑层BLL,BLL使用抽象工厂DALFactory方法,DALFactory创建DAO实例对象,接口层IDAL定义数据操作接口方法,由数据访问层通过各自的公用数据操作类库进行读写数据库,实现对实体类Model的访问。

解决方案文件列表如图

其中DBUtility为公共数据访问类库。三个数据访问层SQLServerDAL、SqliteDAL和OleDAL分别对应sql server、Sqlite、Access数据库。这里我正在使用的是SqliteDAL。

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

具体实现

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

建立实体类进行对象封装

App.config定义选用的DAL及数据库连接信息

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

代码

<?xml version="1.0" encoding="utf-8" ?>                            SqlConnStr.cs文件用于获得相应的连接字符串ConnectionString

代码

/// /// 获得连接字符串ConnectingString/// public static class SqlConnString{    public static string ReturnConnString()    {        string _appPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//当前程序路径        string _dal = System.Configuration.ConfigurationManager.AppSettings["DAL"];//获取App.Config中DAL        string _conn = "";        switch (_dal)        {            /*Sqlite数据库*/            case "CuteMobileSearch.SQLiteDAL":            default:                _appPath = "Data Source=" + _appPath;                _appPath += System.Configuration.ConfigurationManager.AppSettings["SqliteFile"];                return _appPath;            /*SqlServer数据库*/            case "CuteMobileSearch.SQLServerDAL":                _conn = "server=.;database=CuteMobileDB;uid=sa;pwd=123456";                return _conn;            /*access数据库*/            case "CuteMobileSearch.OleDAL":                _appPath = "provider=microsoft.jet.oledb.4.0;data source=" + _appPath + System.Configuration.ConfigurationManager.AppSettings["OleFile"];                return _appPath;        }    }}

然后是抽象工厂DAL通过使用反射创建接口对象的实例

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

代码

/// /// 创建抽象工厂/// public sealed class ObjectCreate{    /*所使用程序集*/    public static readonly string asseblyDAL = System.Configuration.ConfigurationManager.AppSettings["DAL"];    ///     /// 创建对象(不使用缓存:B/S使用)    ///     ///     ///     ///     private static object CreateObject(string AssemblyPath, string classNamespace)    {        try        {            object objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);            return objType;        }        catch        {            return null;        }    }    ///     /// 创建list接口对象    ///     ///     public static CuteMobileSearch.IDAL.Ilist CreateListObj()    {        string className = asseblyDAL + ".listServices";        object obj = CreateObject(asseblyDAL, className);        return (CuteMobileSearch.IDAL.Ilist)obj;    }}
◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

IDAL声明数据访问的接口方法

代码 public interface Ilist{ /*添加对象*/ int Add(CuteMobileSearch.Model.list objList); /*返回所有*/ List GetAll(); /*根据号码查询*/ List GetListByNum(string num); /*根据查询条件*/ List GetListByWhere(string strWhere);}

SqliteDAL继承IDAL,实现对数据库的访问和操作,来访问实体类Model

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

代码

/// /// 基于Sqlite的数据访问类库/// public class listServices : IDAL.Ilist{    ///     /// 添加    ///     /// 返回添加数目    public int Add(CuteMobileSearch.Model.list objList)    {        StringBuilder sbSql = new StringBuilder();        sbSql.Append("INSERT INTO list(");        sbSql.Append("num,code,city,cardtype)");        sbSql.Append(" VALUES(");        sbSql.Append("@num,@code,@city,@cardtype)");        sbSql.Append(";SELECT @@IDENTITY");        SQLiteParameter[] paras ={            new SQLiteParameter("@num",DbType.String,8),            new SQLiteParameter("@code",DbType.String,8),            new SQLiteParameter("@city",DbType.String,16),            new SQLiteParameter("@cardtype",DbType.String,16)        };        paras[0].Value = objList.Num;        paras[1].Value = objList.Code;        paras[2].Value = objList.City;        paras[3].Value = objList.Cardtype;        int num = Wang.DBUtility.SqliteHelper.ExecuteCommand(sbSql.ToString());        return num;    }    ///     /// 返回List    ///     ///     public List GetAll()    {        return GetListByWhere("");    }    ///     /// 根据号码查询    ///     ///     ///     public List GetListByNum(string num)    {        string strWhere = "num LIKE '" + num + "%'";        return GetListByWhere(strWhere);    }    ///     /// 根据条件返回List    ///     ///     ///     public List GetListByWhere(string strWhere)    {        List listList = new List();        StringBuilder strSql = new StringBuilder();        strSql.Append("SELECT * FROM list");        if (strWhere != "")        {            strSql.Append(" WHERE ");            strSql.Append(strWhere);        }        SQLiteDataReader reader = Wang.DBUtility.SqliteHelper.GetReader(strSql.ToString());        while (reader.Read())        {            CuteMobileSearch.Model.list objList = new CuteMobileSearch.Model.list();            if (reader["id"].ToString() != String.Empty)            {                objList.Id = int.Parse(reader["id"].ToString());            }            objList.Num = reader["num"].ToString();            objList.Code = reader["code"].ToString();            objList.City = reader["city"].ToString();            objList.Cardtype = reader["cardtype"].ToString();            listList.Add(objList);        }        reader.Close();        return listList;    }}

以其中的查询结果的GetListByNum方法的UML类图如下

运行结果

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

主程序运行效果如下图

查看详细信息

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

总结

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

此类基于多数据库操作的应用程序是很常见的,通过使用工厂方法模式进行架构,以业务逻辑分层、抽象实现数据访问的思想进行开发,显然在程序的可扩展性、层次性具有较大的优势。

另一点值得说的是,Sqlite数据库的确在一些应用场合中具有较大的优势,关于Sqlite数据库的介绍请参见此文http://zh.wikipedia.org/wiki/SQLite

废话

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

我知道这篇文章技术一般,显然达不到cnblogs的技术层次;我本人的技术水平在cnblogs牛人面前也只是小菜鸟而已,发到首页是希望大家多多拍砖,多提宝贵意见,:)

以上就是使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)的相关内容分享,字数约16087字,希望这对大家有所帮助!豪仕知识网往后会继续推荐使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)相关内容。

相关文章