设计模式学习笔记-抽象工厂模式

概述:                                                                                                         

抽象工厂(abstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类

适用场合:

1.一个系统要独立于它的产品的创建、组合和表示时。

2.一个系统要由多个产品系列中的一个来配置时。

3.当你强调一系列相关的产品对象的设计以便进行联合使用时。

4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。

类图:                                                                                                       

示例代码:                                                                                                  

这里列举出当前比较简单的数据库访问层的代码结构,通过反射来实现,没有用单纯的抽象工厂模式

///<summary>
/// 访问接口
///</summary>
publicinterface IUser
{
void AddUser();
}
///<summary>
/// 数据访问层的工厂配置
///</summary>
class DataAccess
{
///<summary>
/// 程序集路径 一般通过配置文件来读取
///</summary>
privatestaticstring path ="Jqpress.Data";
///<summary>
/// 数据库类型 一般通过配置文件来读取
///</summary>
privatestaticstring dbtype ="Sqlserver";

privatestaticobject lockObject =newobject();

privatestatic IUser _user =null;
///<summary>
/// 通过反射实例化user
///</summary>
///<returns></returns>
publicstatic IUser InstanceUser()
{
string className = path+"." + dbtype +".User";
return CreateInstance<IUser>(_user,className);
}
///<summary>
/// 通过单例 实例化反射
///</summary>
///<typeparam name="T"></typeparam>
///<param name="path"></param>
///<param name="className"></param>
///<returns></returns>
privatestatic T CreateInstance<T>(T _instance,string className)
{
if (_instance==null)
{
lock (lockObject)
{
if(_instance==null)
{
_instance
= (T)Assembly.Load(path).CreateInstance(className);
}
}

}
return _instance;
}
}
///<summary>
/// 实现IUser接口
///</summary>
class UserData:IUser
{
publicvoid AddUser() { }
}
///<summary>
/// 业务层调用
///</summary>
class Service
{
static IUser dao = DataAccess.InstanceUser();
publicvoid AddUser()
{
dao.AddUser();
}
}

  

小结:                                                                                                          

抽象工厂模式在设计底层数据库访问代码的时候用到的比较多,但是一般情况下都是通过反射来实现

posted @ 2011-08-25 11:08  叶鹏  阅读(1259)  评论(3编辑  收藏  举报