Java设计模式之工厂方法模式详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java设计模式之工厂方法模式详解

什么是工厂方法模式?

工厂方法模式是一种创建型设计模式,其主要目的是定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。这种模式在创建对象的超类中有一个创建对象的接口,让子类决定将哪个类实例化。

工厂方法模式的优势

  • 降低耦合性: 将产品的实例化过程与使用过程解耦,客户端不需要知道具体产品的类名,只需知道具体工厂即可。
  • 增加扩展性: 添加新的产品类时,只需要添加相应的具体产品类和对应的具体工厂类,无需修改已有代码。
  • 符合开闭原则: 对扩展开放,对修改关闭。

如何实现工厂方法模式

简单工厂模式(静态工厂方法)

public interface Product {
    void produce();
}
public class ConcreteProductA implements Product {
    @Override
    public void produce() {
        System.out.println("生产产品A");
    }
}
public class ConcreteProductB implements Product {
    @Override
    public void produce() {
        System.out.println("生产产品B");
    }
}
public class SimpleFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        throw new IllegalArgumentException("Invalid product type");
    }
}

工厂方法模式

public interface Factory {
    Product createProduct();
}
public class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
public class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

工厂方法模式的实际应用技巧

灵活扩展产品族

工厂方法模式在创建产品族时非常灵活,可以轻松扩展新的产品类别。

public interface Factory {
    Product createProduct();
    // 扩展新的产品族
    Product createSpecialProduct();
}
public class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
    @Override
    public Product createSpecialProduct() {
        return new SpecialProductA();
    }
}
public class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
    @Override
    public Product createSpecialProduct() {
        return new SpecialProductB();
    }
}

使用抽象工厂模式

抽象工厂模式是工厂方法模式的一种变种,它在创建产品族时更加灵活,可以创建多个不同产品的产品族。

public interface AbstractFactory {
    Product createProduct();
    SpecialProduct createSpecialProduct();
}
public class ConcreteFactoryA implements AbstractFactory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
    @Override
    public SpecialProduct createSpecialProduct() {
        return new SpecialProductA();
    }
}
public class ConcreteFactoryB implements AbstractFactory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
    @Override
    public SpecialProduct createSpecialProduct() {
        return new SpecialProductB();
    }
}

工厂方法模式的典型应用场景

日志记录器

在日志记录器中,不同类型的日志记录器可以由不同的日志记录器工厂负责创建。

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 interface ConnectionPoolFactory {
    ConnectionPool createConnectionPool();
}
public class OracleConnectionPoolFactory implements ConnectionPoolFactory {
    @Override
    public ConnectionPool createConnectionPool() {
        return new OracleConnectionPool();
    }
}
public class MySQLConnectionPoolFactory implements ConnectionPoolFactory {
    @Override
    public ConnectionPool createConnectionPool() {
        return new MySQLConnectionPool();
    }
}

UI控件库

在UI控件库中,可以由不同的控件工厂负责创建不同类型的UI控件。

public interface UIControlFactory {
    Button createButton();
    TextBox createTextBox();
}
public class WindowsUIControlFactory implements UIControlFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
    @Override
    public TextBox createTextBox() {
        return new WindowsTextBox();
    }
}
public class LinuxUIControlFactory implements UIControlFactory {
    @Override
    public Button createButton() {
        return new LinuxButton();
    }
    @Override
    public TextBox createTextBox() {
        return new LinuxTextBox();
    }
}

结语

通过本文的详细解析,我们深入了解了Java设计模式中的工厂方法模式。这个“魔法工厂”在代码的世界中发挥着不可替代的作用,不仅能够降低耦合性、增加扩展性,还能够在产品族的创建上展现出出色的灵活性。让我们在代码的创造过程中,充分发挥工厂方法模式的设计魅力,打造更为优雅、高效的代码!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
23小时前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
11 0
|
23小时前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
5 0
|
23小时前
|
设计模式 Java Android开发
Java设计模式:适配器模式的三种形式(五)
Java设计模式:适配器模式的三种形式(五)
6 0
|
23小时前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
4 0
|
1天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
6 2
|
1天前
|
设计模式 SQL 安全
Java设计模式:单例模式之六种实现方式详解(二)
Java设计模式:单例模式之六种实现方式详解(二)
11 3
|
1天前
|
设计模式 算法 Java
Java设计模式:核心概述(一)
Java设计模式:核心概述(一)
9 2
|
1天前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
1天前
|
设计模式 Java
Java设计模式之适配器模式详解
Java设计模式之适配器模式详解
|
1天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
10 2