设计模式之工厂方法模式

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

}
相关推荐
南宫生20 分钟前
力扣每日一题【算法学习day.133】
java·学习·算法·leetcode
獨枭22 分钟前
如何在 Mac 上安装并配置 JDK 环境变量
java·macos·jdk
m0_7383556934 分钟前
java泛型
java·开发语言
web2u38 分钟前
Docker入门及基本概念
java·运维·服务器·spring·docker·容器
qq_218753311 小时前
常用Git命令
java·git
计算机小白一个1 小时前
蓝桥杯 Java B 组之背包问题(01背包、完全背包)
java·职场和发展·蓝桥杯
计算机毕设定制辅导-无忧学长1 小时前
Maven 基础环境搭建与配置(二)
java·maven
逸狼1 小时前
【JavaEE进阶】Spring IoC
java·spring·java-ee
C#Thread1 小时前
C#上位机--进程和线程的区别
java·开发语言
Biehmltym2 小时前
【SpringMVC】概述 SSM:Spring + SpringMVC + Mybats
java·后端·spring