工厂模式之工厂方法模式(常用)

工厂方法模式

简单工厂模式违背了开闭原则,而工厂方法模式则是简单工厂模式的进一步深化,其不像简单工厂模式通过一个工厂来完成所有对象的创建,而是通过不同的工厂来创建不同的对象,每个对象有对应的工厂创建。

定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

工厂方法模式的结构

抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象。通过使用抽象工厂接口及其具体实现,可以将对象的创建与客户端代码分离,从而实现系统的松耦合。抽象工厂模式涉及多个角色:

抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
具体工厂:主要实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
具体产品:实现了抽象产品角色所定义的接口,有具体工厂创建,它同具体工厂一一对应。

一般使用场景

  • 调用方无需关注对象的创建过程,只需要直接调用即可。
  • 具体子类的数目不确定,后续可能会新增或者减少子类的数量。对子类的使用不确定
  • 调用方根据参数来调用对应的对象。

简单实例代码

java 复制代码
// 定义一个图形接口
interface Shape {
    void draw();
}
// 实现两个具体的图形类,分别是 Circle(圆形)和 Rectangle(矩形)
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}
// 创建一个抽象工厂类 ShapeFactory
// 定义了一个抽象的工厂方法 createShape,子类将实现这个方法来创建具体的图形对象
abstract class ShapeFactory {
    abstract Shape createShape();
}
// 创建两个具体的工厂类,分别是 CircleFactory 和 RectangleFactory
// 它们分别实现了 ShapeFactory 并重写了 createShape 方法来返回相应的图形对象
class CircleFactory extends ShapeFactory {
    @Override
    Shape createShape() {
        return new Circle();
    }
}

class RectangleFactory extends ShapeFactory {
    @Override
    Shape createShape() {
        return new Rectangle();
    }
}
// 使用这些工厂类来创建图形对象
public class FactoryMethodExample {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();
        
        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.createShape();
        rectangle.draw();
    }
}
相关推荐
a努力。16 分钟前
2026 AI 编程终极套装:Claude Code + Codex + Gemini CLI + Antigravity,四位一体实战指南!
java·开发语言·人工智能·分布式·python·面试
Dylan的码园20 分钟前
功能包介绍 : calendar
java·jvm·eclipse
二川bro27 分钟前
Java集合类框架的基本接口有哪些?
java·开发语言·python
菜鸟233号1 小时前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
panzer_maus1 小时前
Redis简单介绍(3)-持久化的实现
java·redis·mybatis
毕设源码-邱学长1 小时前
【开题答辩全过程】以 民宿在线预定平台的设计与实现为例,包含答辩的问题和答案
java·eclipse
不会Android的潘潘1 小时前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp
建军啊1 小时前
java web常见lou洞
android·java·前端
阳无1 小时前
宝塔部署的前后端项目从IP访问改成自定义域名访问
java·前端·部署
Pluchon1 小时前
硅基计划4.0 算法 动态规划进阶
java·数据结构·算法·动态规划