设计模式之工厂方法模式

工厂方法模式(Factory Method)

定义

定义一个创建对象的接口(Abstract Factory),但由子类(Concrete Factory)决定要实例化的类是哪一个。

使用场景

首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:

  1. 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
  2. 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
  3. 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。

主要角色

  1. 抽象产品 Abstract Product
  2. 具体产品 Concrete Product
  3. 抽象工厂 Abstract Factory
  4. 具体工厂 Concrete Factory

类图

示例代码

java 复制代码
@Data
public abstract class Computer {
    protected String brand;
    protected String operationSystem;

}
java 复制代码
public class Computer4Mac extends Computer {
}
java 复制代码
public class Computer4Mi extends Computer {
}
java 复制代码
public interface ComputerFactory {
    Computer makeComputer();
}
java 复制代码
public class ComputerFactory4Mac implements ComputerFactory {
    @Override
    public Computer makeComputer() {
        Computer4Mac computer = new Computer4Mac();
        // 模拟复杂的初始化过程
        computer.setBrand("Mac");
        computer.setOperationSystem("Mac操作系统");
        return computer;
    }
}
java 复制代码
public class ComputerFactory4Mi implements ComputerFactory {

    @Override
    public Computer makeComputer() {
        Computer4Mi computer = new Computer4Mi();
        // 模拟复杂的初始化过程
        computer.setBrand("小米");
        computer.setOperationSystem("小米操作系统");
        return computer;
    }
}
java 复制代码
public class Client {
    public static void main(String[] args) {
        //生产Mac电脑
        ComputerFactory macFactory=new ComputerFactory4Mac();
        Computer computer4Mac = macFactory.makeComputer();
        System.out.println("computer4Mac = " + computer4Mac);

        //生产小米电脑
        ComputerFactory miFactory=new ComputerFactory4Mi();
        Computer computer4mi = miFactory.makeComputer();
        System.out.println("computer4mi = " + computer4mi);
    }

}
相关推荐
IKUN家族7 小时前
Spring MVC(一)
java·spring·mvc
老马识途2.08 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥9 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng9 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_936415699 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
极客先躯10 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq11 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang090711 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯12 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng120412 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee