定义
将创建对象的动作统一管理,根据不同的需求提供给使用者不同的对象
比如说在数据库的连接中,有多种不同的数据产品,java在连接每种产品时的所要求的步骤都是不一样的, 那么程序员在开发的时候就需要非常熟悉每种产品的连接步骤. 同时,每种产品的连接步骤有些是相同的, 如果我们将这些产品的连接步骤写到一个类中去,形成一个工厂类,那么我们在创建连接的时候就可以直接调用工厂类获取连接对象就可以了. 程序员从原来的需要记住所有产品的连接步骤,到只需要告诉工厂需要获取哪个产品的连接对象就可以了
前提条件
要有继承,实现
优缺点
优点
极大的方便了使用者
一个调用者想创建一个对象,只要知道其名称就可以了
扩展性高,如果想增加一个产品,只要扩展一个操作类就可以
屏蔽产品的具体实现,调用者只关心产品的接口
缺点
工厂会同时持有多个类,随着条件的增多, 工厂持有的类也会增加,一定程度上增加了系统的复杂度
一旦添加新的产品,就必须要对工厂的代码进行修改, 当产品较多时, 就有可能造成工厂的复杂度过高,不利于维护
案例演示
获取数据库的连接对象,每个连接对象都有 发送指令, 关闭连接的方法
现有三个数据库 mysql oracle sqlserver
mysql的连接步骤: 校验用户名密码 发送测试信息 创建连接对象
oracle的连接步骤: 校验用户名密码 测试数据传输的效率 创建连接对象
sqlserver的连接步骤:校验用户名密码 发送测试信息 测试数据传输效率 创建连接对象
//数据库接口
public interface DB {
//发送信息方法
public void sendMessage();
//关系数据库连接方法
public void close();
}
//Mysql数据库
public class MySql implements DB{
public MySql(){
System.out.println("mysql连接初始化...");
System.out.println("执行mysql的连接规则");
}
@Override
public void sendMessage() {
System.out.println("mysql发送数据成功");
}
@Override
public void close() {
System.out.println("mysql连接关闭");
}
}
//Oracle数据库
public class Oracle implements DB{
public Oracle(){
System.out.println("oracle连接初始化...");
System.out.println("执行oracle的连接规则");
}
@Override
public void sendMessage() {
System.out.println("oracle发送数据成功");
}
@Override
public void close() {
System.out.println("oracle连接关闭");
}
}
//SqlServer数据库
public class SqlServer implements DB{
public SqlServer(){
System.out.println("sqlserver连接初始化...");
System.out.println("执行sqlserver的连接规则");
}
@Override
public void sendMessage() {
System.out.println("sqlserver发送数据成功");
}
@Override
public void close() {
System.out.println("sqlserver连接关闭");
}
}
//工厂类
public class ConnectFactory {
private String userName;
private String password;
private String dbName;
//初始化工厂类对象的时候,需要获取用户名密码和数据库名称,以便于校验和选择数据连接
public ConnectFactory(String userName, String password, String dbName) {
super();
this.userName = userName;
this.password = password;
this.dbName = dbName;
}
public DB getConnection(){
boolean flg = checkMessage(); //校验用户名密码
if(flg){
switch (dbName) {
case "mysql": // 如果是myql的话 执行mql的连接步骤
System.out.println("发送测试信息");
return new MySql();
case "orcale": // 如果是oracle的话 执行orcale的连接步骤
System.out.println("测试数据库练级效率");
return new Oracle();
case "sqlserver": //如果是sqlserver的话 执行sqlserver的连接步骤
System.out.println("发送测试信息");
System.out.println("测试数据库练级效率");
return new SqlServer();
default:
break;
}
}
return null;
}
//校验用户名密码是否正确
public boolean checkMessage(){
System.out.println("用户名密码检测中....");
if("hanchun".equals(userName)&&"123456".equals(password)){
System.out.println("用户名密码校验成功....");
return true;
}else{
System.out.println("用户名密码校验失败....");
}
return false;
}
}