介绍
创建对象时,不会对客户端暴露创建逻辑,使用一个共同的接口指向新创建的对象。
意图: 定义一个创建对象的接口,让子类决定自己实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
主要解决: 解决接口选择的问题。
何时使用:
- 不知道该使用对象的确切类型,需要在不同的条件下创建不同的实例时
- 希望为框架提供扩展其内部组件的方法时
如何解决: 让其子类实现工厂接口,返回一个抽象对象。
关键代码: 创建过程在子类进行。
主要优点:
- 符合单一职责原则
- 符合开闭原则
- 客户端不用关心产品具体实现细节,将具体产品与客户端代码解耦
实现类图
实现示例
数据库连接需要驱动器,下面使用工厂模式创建驱动器,用于连接数据库。
驱动器有Mysql、Oracle两种,驱动工厂提供创建驱动器方法。
public interface Driver{
void connect();
}
class MysqlDriver implements Driver{
@Override
public void connect() {
System.out.println("Mysql连接");
}
}
class OracleDriver implements Driver{
@Override
public void connect() {
System.out.println("Oracle连接");
}
}
简单工厂模式
class SimpleDriverFactory{
public static Driver createDriver(String driverType){
Driver driver = null;
switch (driverType){
case "Oracle":
driver = new OracleDriver();
break;
case "Mysql":
driver = new MysqlDriver();
break;
default:
driver = null;
}
return driver;
}
}
工厂模式
interface DriverFactory{
Driver createDriver();
}
class OracleDriverFactory implements DriverFactory{
@Override
public Driver createDriver() {
return new OracleDriver();
}
}
class MysqlDriverFactory implements DriverFactory{
@Override
public Driver createDriver() {
return new MysqlDriver();
}
}
使用
public class FactoryPattern {
public static void main(String[] args) {
//工厂模式
DriverFactory driverFactory = new MysqlDriverFactory();
Driver driver = driverFactory.createDriver();
driver.connect();
//简单工厂
Driver oracleDriver = SimpleDriverFactory.createDriver("Oracle");
oracleDriver.connect();
}
}