JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类



一、什么是工厂方法模式

工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装在子类中的方式,在工厂方法模式中父类定义了一个创建对象的接口,但具体的对象的创建由子类决定。这样,将对象的实例化过程延迟到子类中,使得子类可以根据需要创建具体的对象。

在工厂方法模式中,通常会有一个抽象工厂类和多个具体工厂类。抽象工厂类中定义了一个抽象的工厂方法,该方法返回一个抽象产品类的实例。具体工厂类继承抽象工厂类,并实现工厂方法,返回具体的产品类的实例。

工厂方法模式的优点是将对象的创建和使用解耦,增加了系统的灵活性和可扩展性。通过引入抽象工厂类和具体工厂类,可以方便地增加新的产品类和相应的工厂类,符合开闭原则。

工厂方法模式适用于以下 3 33 种情况,请同学们认真学习。

  • 当一个类不知道它所需要的对象的确切类时。
  • 当一个类希望由子类来指定所创建的对象时。
  • 当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时。

总的来说,工厂方法模式通过将对象的创建延迟到子类来实现灵活的对象创建,提高了系统的可扩展性和复用性。


二、工厂方法模式有哪些

2.1 简单工厂模式

简单工厂模式:由一个工厂类通过静态方法创建对象,根据传入的参数类型来决定创建哪个具体的产品对象,样例代码如下。

// 抽象产品类
interface Product {
    void operation();
}
// 具体产品类A
class ConcreteProductA implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}
// 具体产品类B
class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}
// 简单工厂类
class SimpleFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        }
        return null;
    }
}
// 客户端使用
public class Client {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.operation();
        Product productB = SimpleFactory.createProduct("B");
        productB.operation();
    }
}

2.2 工厂方法模式

工厂方法模式:每个具体产品都对应一个具体工厂,抽象工厂类定义工厂方法,由子类实现具体的工厂方法来创建产品对象,样例代码如下。

// 抽象产品类
interface Product {
    void operation();
}
// 具体产品类A
class ConcreteProductA implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}
// 具体产品类B
class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}
// 抽象工厂类
interface Factory {
    Product createProduct();
}
// 具体工厂类A
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
// 具体工厂类B
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.operation();
        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.operation();
    }
}

以上是两种常见的工厂方法模式的示例代码,分别展示了简单工厂模式和工厂方法模式的实现方式,请同学们根据实际需求选择合适的方式来实现工厂方法模式。


三、工厂方法模式的应用场景

工厂方法模式适用于以下 4 44 种场景:

  1. 当一个类不知道它所需要的对象的确切类时,可以使用工厂方法模式。例如,一个图形绘制程序需要根据用户的选择创建不同类型的图形对象,但是在编译时无法确定具体的图形类型。
  2. 当一个类希望由子类来指定所创建的对象时,可以使用工厂方法模式。例如,一个抽象类定义了一个抽象方法,让子类来实现该方法并创建具体的对象。
  3. 当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时,可以使用工厂方法模式。例如,一个日志记录器类需要根据当前的环境选择使用文件日志记录器、数据库日志记录器还是网络日志记录器。
  4. 当需要通过扩展来添加新的产品类,而不需要修改现有的代码时,可以使用工厂方法模式。例如,一个电子商务平台需要不断添加新的支付方式,可以通过添加新的支付工厂类来实现。

总的来说,工厂方法模式适用于需要根据不同的条件创建不同类型的对象,并且希望将对象的创建与具体使用对象的类解耦的场景。它提供了一种灵活的对象创建方式,增加了系统的可扩展性和复用性。


四、工厂方法模式面试题

  1. 什么是工厂方法模式?
  2. 工厂方法模式和简单工厂模式有什么区别?
  3. 工厂方法模式的角色有哪些?
  4. 工厂方法模式的优点是什么?
  5. 工厂方法模式的缺点是什么?
  6. 工厂方法模式在 Java 中如何实现?
  7. 工厂方法模式适用于哪些场景?
  8. 工厂方法模式和抽象工厂模式有什么区别?
  9. 简述使用工厂方法模式实现一个日志记录器的例子。
  10. 工厂方法模式和单例模式可以结合使用吗?

五、总结

本文讲解了 Java 设计模式中的工厂方法模式,并给出了样例代码,在下一篇博客中,将讲解 Java 抽象工厂模式。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
12天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
20 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
86 4
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
96 2
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
22 3
|
2月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
22 1
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
37 1
|
2月前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
31 1