别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

    • Python 设计模式
    • 装饰器模式
    • 抽象工厂模式
    • 建造者模式/生成器模式
    • 原型模式
    • 单例模式
    • 设计模式(2)——工厂方法模式
      • 基本思想和原则
      • 动机
      • 实现
      • 优点
      • 缺点
    • 设计模式(3)——抽象工厂模式
    • 设计模式(4)——模板方法模式
    • 设计模式(5)——代理模式
    • 设计模式(6)——建造者模式
    • 设计模式(7)——策略模式
    • 设计模式(8)——命令模式
    • 设计模式(9)——原型模式
    • 设计模式(10)——中介者模式
    • 设计模式(11)——责任链模式
    • 设计模式(12)——装饰器模式
    • 设计模式(13)——适配器模式
    • 设计模式(14)——迭代器模式
    • 设计模式(15)——观察者模式
    • 设计模式(16)——外观模式
    • 设计模式(17)——状态模式
    • 设计模式(18)——桥接模式
    • 设计模式(19)——享元模式
    • 设计模式(20)——解释器模式
    • 设计模式(21)——组合模式
    • 设计模式(23)——备忘录模式
    • Python 全栈之路系列之单例设计模式
    • 设计模式(22)——访问者模式
    • 工厂方法模式
    • Python 设计模式资源收集
  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • 设计模式
佚名
2017-12-05
目录

设计模式(2)——工厂方法模式

本文介绍工厂方法模式的概念和应用。

# 基本思想和原则

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类。

客户代码不要依赖具体类,而是要依赖抽象。

# 动机

假设某个类有两个个子类 A、B,当需要客户代码需要使用这个类体系时,最简单的方式是根据需要的功能选择相应的子类来创建对象。但是这么做有一个问题,当子类很多时或子类的初始化比较复杂时,客户代码会严重地依赖子类的具体实现。比如客户代码可能是下面这样的(为了简单起见,代码写在了一起):

public abstract class GameConsole {
    public void play() {}
}

public class PlayStation extends GameConsole {
    @Override
    public void play(){
        System.out.println("PlayStation play!");
    }
}

public class XBox extends GameConsole {
    @Override
    public void play(){
        System.out.println("XBox play!");
    }
}

public class Main {
    public static void main(String[] args) {
        GameConsole playstation = new PlayStation();
        playstation.play();
        GameConsole xbox = new XBox();
        xbox.play();
    }
}
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

这里客户代码要直接和具体的游戏机类发生耦合,创建一个游戏机实例都要关注到具体的游戏机类。如果之后游戏机种类增加,客户代码还需要自行做一些判断。

使用工厂方法可以缓解这种问题,下面是工厂方法的实现。

# 实现

public interface IGameConsole {
    public void play();
}

public class PlayStation implements IGameConsole {
    @Override
    public void play() {
        System.out.println("PlayStation play!");
    }
}

public class XBox implements IGameConsole {
    @Override
    public void play() {
        System.out.println("XBox play!");
    }
}

public class GameConsoleFactory {
    public static IGameConsole getGameConsole(String name) {
        if (name.equalsIgnoreCase("playstation")) {
            return new PlayStation();
        } else if (name.equalsIgnoreCase("xbox")) {
            return new XBox();
        } else {
            return null;
        }
    }
}

public class Test {
    public static void main(String[] args) {
        IGameConsole playstation = GameConsoleFactory.getGameConsole("playstation");
        playstation.play();
        IGameConsole xbox = GameConsoleFactory.getGameConsole("xbox");
        xbox.play();
    }
}
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
31
32
33
34
35
36
37
38

运行后输出:

PlayStation play!
XBox play!
1
2

在工厂方法中,我们将游戏机这个概念抽象成一个接口IGameConsole,其中有一个方法play。具体的游戏机类PlayStation和XBox通过实现IGameConsole接口实现了自己的逻辑。另外需要建立一个GameConsoleFactory工厂类,这个工厂类的作用就是为客户代码提供一种创建具体类实例的入口,注意GameConsoleFactory.getGameConsole是一个静态方法。此时客户代码不需要了解具体的游戏机实现类,只要知道IGameConsole接口为我们提供了什么方法就可以了。之后如果增加新的游戏机类,只需要修改GameConsoleFactory.getGameConsole,客户代码不用改动。

# 优点

# 缺点

编辑 (opens new window)
#设计模式
上次更新: 2024-07-23, 01:00:43
单例模式
设计模式(3)——抽象工厂模式

← 单例模式 设计模式(3)——抽象工厂模式→

最近更新
01
2025 面试记录
05-28
02
提升沟通亲和力的实用策略
03-26
03
工作
07-15
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式