设计模式之工厂方法模式

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

}
相关推荐
星火开发设计2 分钟前
C++ deque 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识
独自破碎E2 分钟前
什么是RabbitMQ中的死信队列?
java·rabbitmq·java-rabbitmq
码界奇点3 分钟前
基于Spring与Netty的分布式配置管理系统设计与实现
java·分布式·spring·毕业设计·源代码管理
计算机毕设指导64 分钟前
基于微信小程序的咖啡店点餐系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
Geoking.4 分钟前
【设计模式】外观模式(Facade)详解
java·设计模式·外观模式
点云SLAM5 分钟前
C++设计模式之单例模式(Singleton)以及相关面试问题
c++·设计模式·面试·c++11·单例模式(singleton)
闻道且行之9 分钟前
NLP 部署实操:Langchain-Chatchat 配置文件深度修改与精细化调试
java·自然语言处理·langchain
h7ml10 分钟前
企业微信回调模式解析:从XML到POJO的自定义JAXB编解码器设计
xml·java·企业微信
草莓熊Lotso11 分钟前
Qt 信号与槽深度解析:从基础用法到高级实战(含 Lambda 表达式)
java·运维·开发语言·c++·人工智能·qt·数据挖掘
装不满的克莱因瓶1 小时前
【踩坑】IDEA提交Git .gitignore忽略文件不起作用
java·git·.gitignore·踩坑