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

简介: 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 抽象工厂模式。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2307 35
|
8月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
626 8
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1045 157
|
8月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
873 2
|
10月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
Java 应用服务中间件
Java获取类下的所有子类
首本来觉得实现这个功能应该挺简单的,而且市面上也已经有了开源的工具比如:Reflections,简单的两句代码就能实现这个功能
Java获取类下的所有子类
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
414 1
|
8月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
388 1
|
9月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案