当前位置:编程学习 > asp >>

抽象工厂模式

最基本的数据访问程序
“你先写一段你原来的数据库访问的做法给我看看。”

“那就用‘新增用户’和‘得到用户’为例吧。”

#include <stdio.h>

 

class User

{

public:

       int id;

       char* name;

};

 

class SqlserverUser

{

public:

       void Insert(User* user)

       {

              printf("在SQL Server中给User表添加一条记录 ");

       }

 

       User* GetUser(int id)

       {

              printf("在SQL Server中根据ID得到User表一条记录 ");

              return 0;

       }

};

 

int main()

{

       User* user = new User();

       SqlserverUser* su = new SqlserverUser();

       su->Insert(user);

       su->GetUser(1);

       delete user;

       delete su;

       return 0;

}

“我最开始就是这样写的,非常简单。”

“这里之所以不能换数据库,原因就在于SqlserverUser* su = new SqlserverUser();使得su这个对象被框死在SQL Server上了。如果这里是灵活的,专业点的说法,是多态的,那么在执行‘su->Insert(user);’和‘su->GetUser(1);’时就不用考虑是在用SQL Server还是在用Access了。”

用工厂方法模式的数据访问程序
#include <stdio.h>

 

class User

{

public:

       int id;

       char* name;

};

 

class IUser

{

public:

       virtual void Insert(User* user)=0;

       virtual User* GetUser(int id)=0;

};

 

class SqlserverUser : public IUser

{

public:

       virtual void Insert(User* user)

       {

              printf("在SQL Server中给User表添加一条记录 ");

       }

 

       virtual User* GetUser(int id)

       {

              printf("在SQL Server中根据ID得到User表一条记录 ");

              return 0;

       }

};

 

class AccessUser : public IUser

{

public:

       virtual void Insert(User* user)

       {

              printf("在Access中给User表添加一条记录 ");

       }

 

       virtual User* GetUser(int id)

       {

              printf("在Access中根据ID得到User表一条记录 ");

              return 0;

       }

};

 

class IFactory

{

public:

       virtual IUser* CreateUser()=0;

};

 

class SqlServerFactory : public IFactory

{

public:

       virtual IUser* CreateUser()

       {

              return new SqlserverUser();

       }

};

 

class AccessFactory : public IFactory

{

public:

       virtual IUser* CreateUser()

       {

              return new AccessUser();

       }

};

 

int main()

{

       User* user = new User();

       IFactory* factory = new SqlServerFactory();

       IUser* iu = factory->CreateUser();

       iu->Insert(user);

       iu->GetUser(1);

       delete user;

       delete factory;

       delete iu;

       return 0;

}

“非常好。现在如果要换数据库,只需要把new SqlServerFactory()改成new AccessFactory(),此时由于多态的关系,使得声明IUser接口的对象iu实现根本不知道是在访问哪个数据库,却可以在运行时很好的完成工作,这就是所谓的业务逻辑与数据访问的解耦。”

“但是,大鸟,这样写,代码里还是有指明‘new SqlServerFactory()’呀,我要改的地方,依然很多。”

“这个先不急,待会再说,问题没有完全解决,你的数据库里不可能只有一个User表吧,很可能有其他表,比如增加部门表(Department表),此时如何办呢?”

抽象工厂模式
客户类和工厂类分开。消费者任何时候需要某套产品集合时,只需向抽象工厂请求即可。抽象工厂会再向具体的工厂生产出符合产品集规格的产品。

实现方式(UML类图)

\
实现代码
#include <stdio.h>

 

class User

{

public:

       int id;

       char* name;

};

 

class Department

{

public:

       int id;

       char* deptname;

};

 

// User表接口

class IUser

{

public:

       virtual void Insert(User* user)=0;

       virtual User* GetUser(int id)=0;

};

 

// Department表接口

class IDepartment

{

public:

       virtual void Insert(Department* department)=0;

       virtual Department* GetDepartment(int id)=0;

};

 

class SqlserverUser : public IUser

{

public:

       virtual void Insert(User* user)

       {

              printf("在SQL Server中给User表添加一条记录 ");

       }

 

       virtual User* GetUser(int id)

  &

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,