之前学习了简单工厂和工厂方法。我以数据库的连接实例作为例子,学习了这两个模式的简单使用。假设现在每个数据库都有一个自己的性能测试工具,我们也需要去创建他们的实例,这时候就可以使用抽象工厂模式。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
数据库连接产品类:
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public abstract class Database {
/**
* 连接用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 端口
*/
private Integer port;
Database(String username, String password, Integer port) {
this.username = username;
this.password = password;
this.port = port;
}
/**
* 设置数据库名称
* @return 数据库的名称
*/
protected abstract String getDatabaseName();
/**
* 创建数据库连接实例需要的操作,每种数据库应该都是不一样的
*/
void prepare(){
System.out.println("开始准备进行 "+this.getDatabaseName()+" 需要的初始化步骤");
System.out.println("验证密码 "+this.password+" 是否正确......");
System.out.println("各种初始化操作=======");
}
/**
* 创建连接完成时的操作
*/
void finish(){
System.out.println("用户:"+this.username
+" \n已经成功连接至"+this.getDatabaseName()
+"\n端口:"+this.port
);
}
/**
* 假设这个是实例的功能,可以用来执行查询语句
* @param query 查询语句
*/
public abstract void query(String query);
}
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class Mysql extends Database {
Mysql(String username, String password, Integer port) {
super(username, password, port);
}
@Override
public String getDatabaseName() {
return " MySQL 数据库";
}
@Override
public void query(String query) {
System.out.println(getDatabaseName()+"执行了:"+query);
}
}
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class SqlServer extends Database {
SqlServer(String username, String password, Integer port) {
super(username, password, port);
}
@Override
public String getDatabaseName() {
return " SQLServer 数据库";
}
@Override
void prepare() {
System.out.println(getDatabaseName()+" 初始化完成");
}
@Override
public void query(String query) {
System.out.println(getDatabaseName()+"执行了:"+query);
}
}
数据库性能测试产品类:
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public abstract class PerformanceTestTool {
/**
* 连接该工具
*/
public abstract void connect();
}
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class MysqlPerformanceTestTool extends PerformanceTestTool {
@Override
public void connect() {
System.out.println("Mysql 性能测试工具连接成功");
}
}
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class SqlServerPerformanceTestTool extends PerformanceTestTool {
@Override
public void connect() {
System.out.println("SqlServer 性能测试工具连接成功");
}
}
抽象工厂:
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public abstract class Factory {
/**
* 创建数据库连接实例
* @param username 用户名
* @param password 密码
* @param port 端口
* @return 数据库连接实例
*/
public abstract Database createDatabase(String username,String password,Integer port);
/**
* 创建数据性能测试工具
* @return 工具
*/
public abstract PerformanceTestTool createTestTool();
}
Mysql工厂:
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class MysqlFactory extends Factory {
@Override
public Database createDatabase(String username, String password, Integer port) {
Database database=new Mysql(username,password,port);
database.prepare();
database.finish();
return database;
}
@Override
public PerformanceTestTool createTestTool() {
return new MysqlPerformanceTestTool();
}
}
SqlServer工厂;
package study.factory.abstracts;
/**
* @author 阿呆的小鸡仔
*/
public class SqlServerFactory extends Factory {
@Override
public Database createDatabase(String username, String password, Integer port) {
Database database=new SqlServer(username,password,port);
database.prepare();
database.finish();
return database;
}
@Override
public PerformanceTestTool createTestTool() {
return new SqlServerPerformanceTestTool();
}
}