简单工厂模式

1。意图 

         简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。在GOF的设计模式中没有简单工厂,而是将其作为工厂方法的一个特例加以解释。可以这样理解,简单工厂是参数化的工厂方法。

 2。使用场合

        简单工厂实例化的类具有相同的接口,种类有限并且基本不需要扩展时,可以使用简单工厂。

3。效果

      采用简单工厂的优点:可以使用户根据参数获得对应的类的实例,避免了直接实例化,降低了耦合性。缺点:可以实例化的类型在编译期间已经被确定如果增加新类型,则需要修改工厂。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适宜使用。

4。实现

        通常简单工厂不需要实例化,而是采用静态方法。

5。例子

      在web程序中,我们一般利用web.config文件配置数据库的连接字符串,然后在程序运行的时候读取这些字符串连接数据库,然后进行数据库的操作,但是有时候我们需要程序支持不同的数据库,比如支持SqlServer与Access(当然这些数据库的结构应该一样),这个时候我们可以利用简单工厂模式根据读取得不同的数据库类型来决定程序运行的时候最终要实例化那一种数据库,而且同时也决定最终要如何读取web.conf中的不同的数据库连接字符串。下面给出类图。

6。代码

类DBSimplyFactory

using  System;

namespace  SimplyFactory
{
    
///   <summary>
    
///  DBSimplyFactory 的摘要说明。
    
///   </summary>
     public   class  DBSimplyFactory
    {
        
public  DBSimplyFactory()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public   static  CommonDB CreatDataBase( string  DataStyle, string  connStr)
        {
            CommonDB commonDB
= null ;
            
switch (DataStyle)
            {
                
case   " SQL " :
                    commonDB
= new  SqlDB(connStr);
                    
break ;
                
case   " OLE " :
                    commonDB
= new  OleDB(connStr);
                    
break ;
            }
            
return  commonDB;
        }

    }
}

类CommonDB

using  System;
using  System.Data;



namespace  SimplyFactory
{
    
///   <summary>
    
///  CommonDB 的摘要说明。
    
///   </summary>
     public   abstract   class  CommonDB
    {
        
public  CommonDB()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public  CommonDB( string  connString)
        {
            connStr
= connString;
        }
        
protected   string  connStr;
        
public   abstract  DataTable ExeSql( string  qureString);
        
public   abstract   void  Open();
        
public   abstract   void  Close();

    }
}

类SqlDB

using  System;
using  System.Data;
using  System.Data.SqlClient;

namespace  SimplyFactory
{
    
///   <summary>
    
///  SqlDB 的摘要说明。
    
///   </summary>
     public   class  SqlDB:CommonDB
    {
        
private  SqlConnection SqlConn = null ;
        
public  SqlDB()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public  SqlDB( string  sqlConnString)
        {
            
this .connStr = sqlConnString;
        }
        
public   override   void  Open()
        {
            
                SqlConn
= new   SqlConnection(connStr);
                SqlConn.Open();
            
        }
        
public   override   void  Close()
        {
            SqlConn.Close();
        }
        
public   override  System.Data.DataTable ExeSql( string  qureString)
        {
            SqlCommand sqlCommand
= new  SqlCommand(qureString,SqlConn);
            SqlDataAdapter sqlAdapter
= new  SqlDataAdapter(sqlCommand);
            DataTable sqlDataTable
= new  DataTable();
            sqlAdapter.Fill(sqlDataTable);
            
return  sqlDataTable;
        }



    }
}

类OleDB

using  System;
using  System.Data;
using  System.Data.OleDb;

namespace  SimplyFactory
{
    
///   <summary>
    
///  OleDB 的摘要说明。
    
///   </summary>
     public   class  OleDB:CommonDB
    {
        
private  OleDbConnection OleConn = null ;
        
public  OleDB()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public  OleDB( string  oleConnString)
        {
            
this .connStr = oleConnString;
        }
        
public   override   void  Open()
        {
            
            OleConn
= new   OleDbConnection(connStr);
            OleConn.Open();
            
        }
        
public   override   void  Close()
        {
            OleConn.Close();
        }
        
public   override  System.Data.DataTable ExeSql( string  qureString)
        {
            OleDbCommand oleCommand
= new  OleDbCommand(qureString,OleConn);
            OleDbDataAdapter oleAdapter
= new  OleDbDataAdapter(oleCommand);
            DataTable oleDataTable
= new  DataTable();
            oleAdapter.Fill(oleDataTable);
            
return  oleDataTable;
        }



    
    }
}

类ReadConfigFactory

using  System;

namespace  SimplyFactory
{
    
///   <summary>
    
///  ReadConfigFactory 的摘要说明。
    
///   </summary>
     public   class  ReadConfigFactory
    {
    
public  ReadConfigFactory()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
    
        
public   static  ReadConfig CreatReadConfig( string  dbStyle)
        {
            ReadConfig EntityConfig
= null ;
            
switch (dbStyle)
            {
                
case   " SQL " :
                    EntityConfig
=   new  ReadSqlConfig();
                    
break ;
                
case   " OLE " :
                    EntityConfig
=   new  ReadOleConfig();
                    
break ;
            }
            
return  EntityConfig;
        }
    }
}

 

类ReadConfig

using  System;

namespace  SimplyFactory
{
    
///   <summary>
    
///  ReadConfig 的摘要说明。
    
///   </summary>
     public   abstract   class  ReadConfig
    {
        
public  ReadConfig()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
private   static   string  ServerStyle  =  System.Configuration .ConfigurationSettings .AppSettings [ " ServerStyle " ];
        
public   static   string  GetDataStyle()
        {
            
return  ServerStyle;
        }
        
public   abstract   string  GetConnString();
        
    }
}

类ReadSqlConfig

using  System;

namespace  SimplyFactory
{
    
///   <summary>
    
///  ReadConfig 的摘要说明。
    
///   </summary>
     public   class  ReadSqlConfig:ReadConfig
    {
        
public  ReadSqlConfig()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
        
private   static   string  SERVER  =  System.Configuration.ConfigurationSettings.AppSettings[ " ServerName " ];
        
private   static   string  DATABASE  =  System.Configuration .ConfigurationSettings .AppSettings [ " DataBase " ];
        
private   static   string  UID  =  System.Configuration .ConfigurationSettings .AppSettings [ " UserId " ];
        
private   static   string  PWD  =  System.Configuration .ConfigurationSettings .AppSettings [ " PassWord " ];        
        
private   static   string  ConnStr  =   " server= "   +  SERVER  +   " ;database= "   +  DATABASE  +   " ;uid= "   +  UID  +   " ;pwd= "   +  PWD + " ; " ;
        
public   override   string  GetConnString()
        {
            
return  ConnStr;            
        }

        

    }
}

类ReadOleConfig

using  System;

namespace  SimplyFactory
{
    
///   <summary>
    
///  ReadOleConfig 的摘要说明。
    
///   </summary>
     public   class  ReadOleConfig:ReadConfig
    {
        
public  ReadOleConfig()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
private   string  preConnStr =  System.Configuration.ConfigurationSettings.AppSettings[ " preConnStr " ];
        
private   string  secConnStr = System.Configuration.ConfigurationSettings.AppSettings[ " secConnStr " ];
        
public   override   string  GetConnString()
        {
            
return  preConnStr + System.Web.HttpContext.Current.Server.MapPath(secConnStr) + " ; " ;
        }

    }
}

 web.config文件的配置

<!--
       SqlServer的例子介绍
        <add key="ServerStyle" value="SQL"/>  
        <add key="ServerName" value="SqlServer" />
        <add key="DataBase" value="student" />
        <add key="UserId" value="" />
        <add key="PassWord" value="" />
        ACCESS的例子介绍
        <add key="ServerStyle" value="OLE"/>
        <add key="preConnStr" value="provider=microsoft.jet.oledb.4.0;data source="/>
        <add key="secConnStr" value="/SimplyFactory/data/student.mdb"/>    
        
 
-->
     
< appSettings >
        
< add  key ="ServerStyle"  value ="OLE" />
        
< add  key ="preConnStr"  value ="provider=microsoft.jet.oledb.4.0;data source=" />
        
< add  key ="secConnStr"  value ="/SimplyFactory/data/student.mdb" />
      
</ appSettings >

读取数据的代码,我写在了Page_Load中

private   void  Page_Load( object  sender, System.EventArgs e)
        {
            
//  在此处放置用户代码以初始化页面
             string  dataStyle = ReadConfig.GetDataStyle();
            ReadConfig entityReadConfig
= ReadConfigFactory.CreatReadConfig(dataStyle);
            
string  connStr = entityReadConfig.GetConnString();
            CommonDB commondb
= DBSimplyFactory.CreatDataBase(dataStyle,connStr);
            commondb.Open();
            
string  mySelectString = " select stu_id,stu_name,dep_name from stu_infor " ;
            DataTable stu_infor
= commondb.ExeSql(mySelectString);
            commondb.Close();
            DataGrid1.DataSource
= stu_infor.DefaultView;
            DataGrid1.DataBind();
        }

 其中数据库的设计样式为下图

代码运行结果如下:

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值