设计模式之工厂方法模式

工厂方法模式(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);
    }

}
相关推荐
智慧物业老杨1 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava
步行cgn8 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风8 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae8 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路9 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog10 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog10 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz10 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
qq_25183645711 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
caoerzhong11 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源