一、实验内容
利用抽象工厂模式实现不同数据库连接。要求按照P102页6.3.2实例说明,实现类图代码,并且编写测试客户端,给出动态更换数据库的运行结果。
二.设计类图
三、类具体代码(要求有相关注释)
//Connection接口:
class Connection
{
public:
//连接函数,不同的数据库有不同的连接方式,定义为虚函数,完成多态
virtual void connect() = 0
{
cout << "connect sucessful!" << endl;
}
};
MySQLConnection类:
//mysql连接类
class MySQLConnection :public Connection
{
public:
void connect()
{
cout << "Mysql连接成功。" << endl;
}
};
//OracleConnection类
//Oracle连接类
class OracleConnection :public Connection
{
public:
void connect()
{
cout << "Oracle连接成功。" << endl;
}
};
//DBFactory接口
//数据库工厂接口
class DBFactory
{
public:
virtual Connection* createConnection() = 0
{
cout << "create Connection" << endl;
}
virtual Statement* createStatement() = 0
{
cout << "create stament" << endl;
}
};
//MySQLFactory类
//MySQL数据库工厂,实例化MySQL数据库连接对象,MySQL语句对象
class MySQLFactory:public DBFactory
{
public:
Connection* createConnection()
{
return new MySQLConnection();
}
Statement* createStatement()
{
return new MySQLStatement();
}
};
//OracleFactory类
//Oracle数据库工厂,实例化Oracle数据库连接对象,Oracle语句对象
class OracleFactory:public DBFactory
{
public:
Connection* createConnection()
{
return new OracleConnection();
}
Statement* createStatement()
{
return new OracleStatement();
}
};
//Statement接口
//语句接口
class Statement
{
public:
virtual void statement() = 0//执行语句
{
cout << "statement sucefull!" << endl;
}
};
OracleStatement类
//Oralce语句类
class OracleStatement:public Statement
{
public:
void statement()
{
cout << "Oracle语句执行" << endl;
}
};
//MySQLStatement类
//mysql语句类
class MySQLStatement:public Statement
{
public:
void statement()
{
cout << "mysql语句执行" << endl;
}
};
//测试函数:
int main()
{
DBFactory* factory;
Connection* connection;
Statement* statement;
factory = new OracleFactory();//建立一个Oracle数据库连接工厂
connection = factory->createConnection();//建立Oracle数据库连接,将其赋值给一个连接对象
statement = factory->createStatement();//建立一个Oracle语句执行,将其赋给一个语句对象
connection->connect();//数据库连接
statement->statement();//数据库语句执行
}
四.运行结果截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/eb8f7f737bbe4120b3cd112c6b02534d.png)
五.设计模式分析总结
(1) 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
(2) 抽象工厂模式包含四个角色:抽象工厂用于声明生成抽象产品的法;具体工厂实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。
(3) 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
(4)抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
(5 )抽象工厂模式适用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多于一个的产品族,而每次只使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。