工厂模式(Factory Pattern)是创建型设计模式中最常用的一种,它提供了一种创建对象的最佳方式。工厂模式的核心思想是将对象的创建与使用分离,客户端无需知道具体对象的创建细节,只需通过工厂获取所需对象。
工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂模式主要分为三种类型:
简单工厂模式包含以下角色:
// 抽象产品
public interface Product {
void use();
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("使用产品A");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("使用产品B");
}
}
// 简单工厂
public class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("未知产品类型");
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use();
Product productB = SimpleFactory.createProduct("B");
productB.use();
}
}优点:
缺点:
工厂方法模式包含以下角色:
// 抽象产品
public interface Product {
void use();
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("使用产品A");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("使用产品B");
}
}
// 抽象工厂
public interface Factory {
Product createProduct();
}
// 具体工厂A
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂B
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use();
}
}优点:
缺点:
抽象工厂模式包含以下角色:
// 抽象产品A
public interface ProductA {
void useA();
}
// 具体产品A1
public class ConcreteProductA1 implements ProductA {
@Override
public void useA() {
System.out.println("使用产品A1");
}
}
// 具体产品A2
public class ConcreteProductA2 implements ProductA {
@Override
public void useA() {
System.out.println("使用产品A2");
}
}
// 抽象产品B
public interface ProductB {
void useB();
}
// 具体产品B1
public class ConcreteProductB1 implements ProductB {
@Override
public void useB() {
System.out.println("使用产品B1");
}
}
// 具体产品B2
public class ConcreteProductB2 implements ProductB {
@Override
public void useB() {
System.out.println("使用产品B2");
}
}
// 抽象工厂
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂1
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂2
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 使用第一个工厂族
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA1 = factory1.createProductA();
ProductB productB1 = factory1.createProductB();
productA1.useA();
productB1.useB();
// 使用第二个工厂族
AbstractFactory factory2 = new ConcreteFactory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
productA2.useA();
productB2.useB();
}
}优点:
缺点:
合理选择工厂模式类型:
考虑使用静态工厂方法:
public class Product {
private Product() {}
public static Product create() {
return new Product();
}
}结合单例模式:
public class SingletonFactory {
private static final Product INSTANCE = new Product();
public static Product getInstance() {
return INSTANCE;
}
}使用依赖注入框架:
命名规范:
createXxx()或getXxx()valueOf()、of()、getInstance()等我们需要一个日志系统,可以支持多种日志记录方式(文件、数据库、控制台),并且可以方便地扩展新的日志记录方式。
// 日志记录器接口
public interface Logger {
void log(String message);
}
// 文件日志记录器
public class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("文件日志: " + message);
}
}
// 数据库日志记录器
public class DatabaseLogger implements Logger {
@Override
public void log(String message) {
System.out.println("数据库日志: " + message);
}
}
// 控制台日志记录器
public class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println("控制台日志: " + message);
}
}
// 日志记录器工厂接口
public interface LoggerFactory {
Logger createLogger();
}
// 文件日志记录器工厂
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new FileLogger();
}
}
// 数据库日志记录器工厂
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new DatabaseLogger();
}
}
// 控制台日志记录器工厂
public class ConsoleLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new ConsoleLogger();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
LoggerFactory factory = new FileLoggerFactory();
Logger logger = factory.createLogger();
logger.log("这是一个测试消息");
// 可以轻松切换日志方式
factory = new DatabaseLoggerFactory();
logger = factory.createLogger();
logger.log("这是一个测试消息");
}
}如果需要同时支持不同级别的日志记录(如Info、Error),可以使用抽象工厂模式:
// 抽象产品:Info日志
public interface InfoLogger {
void info(String message);
}
// 抽象产品:Error日志
public interface ErrorLogger {
void error(String message);
}
// 抽象工厂
public interface LoggerAbstractFactory {
InfoLogger createInfoLogger();
ErrorLogger createErrorLogger();
}
// 文件日志具体工厂
public class FileLoggerFactory implements LoggerAbstractFactory {
@Override
public InfoLogger createInfoLogger() {
return new FileInfoLogger();
}
@Override
public ErrorLogger createErrorLogger() {
return new FileErrorLogger();
}
}
// 数据库日志具体工厂
public class DatabaseLoggerFactory implements LoggerAbstractFactory {
@Override
public InfoLogger createInfoLogger() {
return new DatabaseInfoLogger();
}
@Override
public ErrorLogger createErrorLogger() {
return new DatabaseErrorLogger();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
LoggerAbstractFactory factory = new FileLoggerFactory();
InfoLogger infoLogger = factory.createInfoLogger();
ErrorLogger errorLogger = factory.createErrorLogger();
infoLogger.info("普通信息");
errorLogger.error("错误信息");
// 切换日志方式
factory = new DatabaseLoggerFactory();
infoLogger = factory.createInfoLogger();
errorLogger = factory.createErrorLogger();
infoLogger.info("普通信息");
errorLogger.error("错误信息");
}
}工厂模式是面向对象设计中最重要的模式之一,它通过将对象的创建与使用分离,提高了系统的灵活性和可维护性。三种工厂模式各有适用场景:
在实际开发中,我们应该根据具体需求选择合适的工厂模式。同时,现代Java开发中,我们可以结合Spring等IoC容器,更优雅地实现工厂模式的功能。
理解并掌握工厂模式,能够帮助我们设计出更加灵活、可扩展的系统架构,是每一位Java开发者必备的技能。