吴志勇的博客 吴志勇的博客
  • h5

    • HTML5&CSS3
  • scss

    • css预处理语言
  • JavaScript

    • JavaScript教程
    • Ajax
    • ES6教程
    • NodeJS
    • Typescript
  • 框架

    • Jquery
    • VUE
    • React
  • Swing专题
  • java基础
  • javaweb
  • 框架
  • 数据库
  • netty
  • 设计模式
  • 微服务及架构
  • 云原生
  • maven
  • 单元测试
工具
我的
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

吴志勇

......
  • h5

    • HTML5&CSS3
  • scss

    • css预处理语言
  • JavaScript

    • JavaScript教程
    • Ajax
    • ES6教程
    • NodeJS
    • Typescript
  • 框架

    • Jquery
    • VUE
    • React
  • Swing专题
  • java基础
  • javaweb
  • 框架
  • 数据库
  • netty
  • 设计模式
  • 微服务及架构
  • 云原生
  • maven
  • 单元测试
工具
我的
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Swing专题

  • java基础

  • javaweb

  • 框架

  • Maven
  • 单元测试
  • 动态代理
  • 数据库

  • netty

  • 设计模式

    • simple_factory
      • 模式引入
        • 问题描述
        • 模式定义
        • 问题分析
      • 模式实现
        • 解决方案
        • 代码实现
        • 结构组成
      • 模式评价
        • 适用场景
    • factory_method
    • abstract_factory
    • singleton
    • builder
    • prototype
    • adapter
    • decorator
    • facade
    • bridge
    • proxy
    • composite
    • flyweight
    • observer
    • command
    • state
    • chain_of_responsibility
    • template_method
    • strategy
    • interpreter
    • mediator
    • visitor
    • memento
    • iterator
  • 微服务及架构

  • 云原生

  • Velocity模板引擎
  • 后端
  • 设计模式
wuzhiyong
2025-01-13

simple_factory

# 简单工厂模式

# 模式引入

# 问题描述

小菜参加面试,面试要求用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。要实现这一程序并不困难,但若未来该程序要增添新的运算符号,而仍想使用这个程序的话,程序应当要设计得耦合性低些,尽量减少增加功能时需要的改动。同时,应该考虑把计算部分独立出来,这样如果未来该windows程序迁移到web版,计算部分也不需要修改。

# 模式定义

简单工厂模式(Simple Factory Pattern)是用一个单独的类来实现具体的实例化过程,避免客户端对具体实例化过程的显式指定。

# 问题分析

简单工厂模式可以用于这个问题。将加减乘除等运算类独立实现,并创建工厂类维护对运算类的使用。之后若需要增加新的运算符号,则只需增加运算类,修改工厂类即可,这也同时降低修改后的重复编译量(松耦合)。此外,简单工厂模式降了低业务逻辑和界面逻辑的耦合,易于复用(不是复制),若未来该windows程序迁移到web版,业务部分(计算部分)不需要修改。

# 模式实现

# 解决方案

使用简单工厂模式来解决问题。

  1. 首先定义一个抽象的运算类Operation,定义抽象类的同时定义其所有子类的公共接口,并定义一个方法getResult(numberA,numberB)用于得到结果;
  2. 分别创造具体的加减乘除运算类,都为抽象运算类的子类,则具体运算类之中若有一者需要修改,不会影响其它的运算类。覆写具体运算类中getResult(numberA,numberB)方法实现运算操作;
  3. 创建简单工厂类OperationFactory,根据输入参数,使用条件判断调用具体的运算类,实现业务逻辑和界面逻辑的分离。

# 代码实现

首先定义一个抽象运算类。

public abstract class Operation {
    public double numberA;
    public double numberB;

    public abstract double getResult();
}
1
2
3
4
5
6

定义加减乘除等运算类。

public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        return numberA + numberB;
    }
}

public class OperationSub extends Operation {
    @Override
    public double getResult() {
        return numberA - numberB;
    }
}

public class OperationMul extends Operation {
    @Override
    public double getResult() {
        return numberA * numberB;
    }
}

public class OperationDiv extends Operation {
    @Override
    public double getResult() {
        if(numberB == 0){
            throw new RuntimeException("除数不能为0。");
        }
        return numberA / numberB;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

简单运算工厂类维护创造运算实例的过程。

public class OperationFactory {
    public static Operation createOperation(char operator) {
        Operation operation = null;

        switch (operator) {
            case '+':
                operation = new OperationAdd();
                break;
            case '-':
                operation = new OperationSub();
                break;
            case '*':
                operation = new OperationMul();
                break;
            case '/':
                operation = new OperationDiv();
                break;
        }
        return operation;
    }  
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

客户端如下。

public class Calculator {
    public static void main(String[] args) {
        Operation operation;
        char operator;
    
        operator = '+';
        operation = OperationFactory.createOperation(operator);
        operation.numberA = 1;
        operation.numberB = 2;
    
        System.out.println(operation.getResult());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

运行结果如下。

3
1

# 结构组成

简单工厂模式由三类主要角色组成:

  1. 抽象类:定义所有支持算法的公共接口,在这个例子中具体运算抽象类;
  2. 具体算法类:具体的算法,在这个例子中具体为加减乘除运算类;
  3. 简单工厂类:维护对运算类的应用。

以上述问题为例,结构如下

简单工厂模式UML

# 模式评价

# 适用场景

将类类比为产品,则使用者可以在不清楚类生产的具体过程的情况下,使用不同的产品。

上次更新: 2025-02-06 00:56:14

← 用 Netty 自己实现 Dubbo RPC factory_method→

Copyright © 2020-2025 wuzhiyong
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式