设计模式——工厂模式
介绍
工厂模式(Factory Pattern),在创建对象时不会对客户端暴露创建逻辑,而是通过一个共同的接口来指向对象的。(即不是通过new去创建对象)。
意图
定义一个创建对象的接口,让子类去决定实例化哪个对象。
解决
接口选择问题
优点
- 调用者想创建对象时只需要直到名称即可;
- 扩展性高,如果想增加一个产品,只需要扩展一个工厂类即可;
- 屏蔽产品的实现,调用者只需要关心产品接口;
缺点
- 每次增加产品时都需要新增一个具体类和实现工厂,系统中类的个数成倍增加,一定程度上增加了系统的复杂性
使用场景
- 数据库连接(支持MySQL、Oracle、SQLServer、DB2等)
- 邮件服务器(支持POP3、IMAP、HTTP等)
UML

示例
DatabaseConnect.java
package cn.geoaryblog.design.cretedg.simplefactory;
public interface DatabaseConnect {
DatabaseConnect getConnection();
}
MysqlConnection.java
package cn.geoaryblog.design.cretedg.simplefactory;
public class MysqlConnection implements DatabaseConnect {
@Override
public DatabaseConnect getConnection() {
System.out.println("当前是MySQL数据库,返回MySQL数据库连接");
return null;
}
}
OracleConnection.java
package cn.geoaryblog.design.cretedg.simplefactory;
public class OracleConnection implements DatabaseConnect {
@Override
public DatabaseConnect getConnection() {
System.out.println("当前是Oracle数据库,返回Oracle数据库连接");
return null;
}
}
SQLServerConnection.java
package cn.geoaryblog.design.cretedg.simplefactory;
public class SQLServerConnection implements DatabaseConnect {
@Override
public DatabaseConnect getConnection() {
System.out.println("当前是sqlserver数据库,返回sqlservere数据库连接");
return null;
}
}
工厂类 DatabaseConnectionFactory.java
package cn.geoaryblog.design.cretedg.simplefactory;
public class DatabaseConnectionFactory {
public static DatabaseConnect getCon(String datatype) {
switch (datatype) {
case "Oracle":
return new OracleConnection().getConnection();
case "MySQL":
return new MysqlConnection().getConnection();
case "SQLServer":
return new SQLServerConnection().getConnection();
default:
System.out.println("不支持当前数据库【"+datatype+"】");
return null;
}
}
}
测试方法 SimpleFactoryMain.java
package cn.geoaryblog.design.cretedg.simplefactory;
public class SimpleFactoryMain {
public static final String DATABASE_MYSQL = "MySQL";
public static final String DATABASE_ORACLE = "Oracle";
public static final String DATABASE_SQLSERVER = "SQLServer";
public static final String DATABASE_DB2 = "DB2";
public static void main(String[] args) {
DatabaseConnect connect = DatabaseConnectionFactory.getCon(DATABASE_MYSQL);
System.out.println(connect);
// 当前是MySQL数据库,返回MySQL数据库连接
}
}

浙公网安备 33010602011771号