GoF之工厂模式

GoF之工厂模式

文章目录

  • GoF之工厂模式
  • 每博一文案
  • 1. 简单说明“23种设计模式”
    • 1.2 介绍工厂模式的三种形态
    • 1.3 简单工厂模式(静态工厂模式)
      • 1.3.1 简单工厂模式的优缺点:
    • 1.4 工厂方法模式
      • 1.4.1 工厂方法模式的优缺点:
    • 1.5 抽象工厂模式
      • 1.6 抽象工厂模式的优缺点:
  • 2. 总结:
  • 3. 最后:


每博一文案

	苏东波苏轼《望江南 超然台作》
休对故人思故国,且将薪火试新茶,诗酒趁年华
休对故人思故国:它告诉我们应当忘记过去。
且将薪火试新茶:又告诉我们要活好当下。
诗酒趁年华:更告诉我们既要面对未来,又要及时努力

1. 简单说明“23种设计模式”

设计模式:一种可以被重复利用的解决方案。

GoF(Gang of Four),中文名——四人组。

《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著。这几位作者常被称为"四人组(Gang of Four)"。

该书中描述了23种设计模式。我们平常所说的设计模式就是指这23种设计模式。

不过除了GoF23种设计模式之外,还有其它的设计模式,比如:JavaEE的设计模式(DAO模式、MVC模式等)。

GoF23种设计模式可分为三大类:

一. 创建型(5个):解决对象创建问题。

  1. 单例模式
  2. 工厂方法模式
  3. 抽象工厂模式
  4. 建造者模式
  5. 原型模式

二. 结构型 (7个):一些类或对象组合在一起的经典结构

  1. 代理模式
  2. 装饰模式
  3. 适配器模式
  4. 组合模式
  5. 享元模式
  6. 外观模式
  7. 桥接模式

三. 行为型 (11个):解决类或对象之间的交互问题。

  1. 策略模式
  2. 模板方法模式
  3. 责任链模式
  4. 观察者模式
  5. 迭代子模式
  6. 命令模式
  7. 备忘录模式
  8. 状态模式
  9. 访问者模式
  10. 中介者模式
  11. 解释器模式

而这里我们该篇的主角**“工厂模式”** 是解决对象创建问题的,所以工厂模式可以归属于创造型设计模式当中。

这里说明一下,为什么我们学习 Spring框架,突然就跑过来学习,工厂模式呢?

原因是:在Spring框架底层当中,使用了大量的工厂模式,而学习工厂模式,有利于我们更加透彻的学习Spring,更加了解Spring框架的底层原理,从而肆无忌惮的使用Spring。

1.2 介绍工厂模式的三种形态

工厂模式通常有三种形态:

  1. 第一种:简单工厂模式(Simple Factory):不属于23种设计模式之一。简单工厂模式又叫做:静态工厂方法模式(原因是其中定义的是一个static 静态的方法,进行工厂处理生产的)。简单工厂模式是工厂方法模式的一种特殊实现。
  2. 第二种:工厂方法模式(Factory Method):是23种设计模式之一。
  3. 第三种:抽象工厂模式(Abstract Factory):是23种设计模式之一。

1.3 简单工厂模式(静态工厂模式)

简单工厂模式的角色包括三个:

  1. 抽象产品角色
  2. 具体产品角色
  3. 工厂类角色

简单工厂模式的代码如下:

抽象产品角色:

抽象产品角色:武器产品,抽象的,自然就是抽象类了 abstract

作用: 用来定义武器的统一的所具备的功能(这里我们给予上)——攻击(武器都具备攻击的功能)


/*** 抽象产品角色:武器产品* 抽象的,自然就是 抽象类了 abstract*/
public abstract class Weapon {/*** 所以的武器都要具备攻击*/public abstract void attack();
}

具体产品角色:

这里我们定义两个具体产品角色(有关武器的具体产品:Dagger 匕首,Tank 坦克)

同时具体产品角色都 extends继承了 抽象产品角色Weapon,统一上,武器都具备攻击 attack()

在这里插入图片描述

/*** 具体产品: 匕首* 同样继承 Weapon 抽象武器产品,保持同性*/
public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("Dagger 匕首攻击");}
}
/*** 具体产品角色:坦克* 同时具体产品要继承 抽象武器产品,保持武器的同性*/
public class Tank extends Weapon {@Overridepublic void attack() {System.out.println("Tank 坦克攻击");}
}

工厂类角色:

抽象工厂类角色:根据不同的武器类型生产武器

注意: 该获取武器的方法是——静态方法(static),要获取什么产品,就看你传什么参数,传Tank获取坦克,传Dagger获取匕首,
简单工厂模式中是通过定义一个静态方法——获取的,所以又被称为:静态工厂方法模式。

在这里插入图片描述

在这里插入图片描述

/*** 抽象工厂类角色:* 根据不同的武器类型生产武器*/
public class WeaponFactory {/*静态方法,要获取什么产品,就看你传什么参数,传Tank获取坦克,传Dagger获取匕首,简单工厂模式中有一个静态方法,所以被称为:静态工厂方法模式。*/public static Weapon get(String type) {// 参数不对,返回 nullif (null == type || type.length() == 0) {return null;}// 要匕首产品,给匕首if ("DAGGER".equals(type)) {return new Dagger();} else if ("TANK".equals(type)) {  // 要坦克给产品,给坦克return new Tank();} else {throw new RuntimeException("暂时不支持该武器的生产制造");}}
}

测试程序(客户端程序):

在这里插入图片描述

package com.rainbowsea.test;import com.rainbowsea.bean.Weapon;
import com.rainbowsea.bean.WeaponFactory;public class Test {public static void main(String[] args) {// 我们要坦克Weapon tank = WeaponFactory.get("TANK");tank.attack();  // 坦克攻击// 我们要匕首,拜托武器工厂给我们制造Weapon dagger = WeaponFactory.get("DAGGER");dagger.attack(); // 匕首攻击}
}

在这里插入图片描述

1.3.1 简单工厂模式的优缺点:

简单工厂模式的优点:

客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要向工厂索要即可,初步实现了责任的分离。客户端只负责“消费”,工厂负责“生产”。生产和消费分离。

简单工厂模式的缺点:

  1. 缺点1:工厂类集中了所有产品的创造逻辑,形成一个无所不知的全能类,有人把它叫做上帝类。显然工厂类非常关键,不能出问题,一旦出问题,整个系统瘫痪。
  2. 缺点2:不符合OCP开闭原则,在进行系统扩展时,需要修改工厂类。

在这里插入图片描述

说明一下:Spring中的BeanFactory就使用了简单工厂模式。关于这一点,我们后面会详细说明

1.4 工厂方法模式

工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

工厂方法模式的角色包括:

  1. 抽象工厂角色
  2. 具体工厂角色
  3. 抽象产品角色
  4. 具体产品角色

简单的说:就是一个产品,会对应着一个工厂。

首先,定义好,抽象产品角色,用于统一产品的功能。这里我们还是以武器 为例子,武器统一都具有攻击的作用。

在这里插入图片描述

/*** 武器的抽象产品,* 同样是统一武器,武器都具备攻击的功能*/
public abstract class Weapon {//public abstract void attack();
}

定义具体产品角色,这里,我们还是以有关武器的具体产品:Dagger 匕首,Tank 坦克)

同时具体产品角色都 extends继承了 抽象产品角色Weapon,统一上,武器都具备攻击 attack() 。这一点和简单工厂模式一致。

在这里插入图片描述

/*** 具体工厂角色(武器匕首)*/
public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("Dagger 匕首攻击");}
}

/*** 具体工厂角色(武器坦克)*/
public class Tank extends Weapon{@Overridepublic void attack() {System.out.println("Tank 坦克攻击");}
}

抽象工厂角色

这里我们定义一个接口,作为抽象工厂角色,用于约束,生产类的工厂的角色的。都要进行一个生产get() 。需要注意的是:这个方法不是静态的,是实例方法,这是与简单工厂模式的一大区别

在这里插入图片描述

在这里插入图片描述

/*** 武器工厂的接口* 统一武器工厂的生产*/
public interface WeaponFactory {/*** 这个方法不是静态的,是实例方法,* 这里是简单工厂模式的最大的区别*/Weapon get();
}

具体工厂角色

这里是两个分别为了,生产(Dagger 匕首,Tank 坦克)的具体工厂

  • public class DaggerFactory implements WeaponFactory

  • public class TankFactory implements WeaponFactory

/*** 具体工厂角色* 生产匕首的工厂*/
public class DaggerFactory implements WeaponFactory{@Overridepublic Weapon get() {return new Dagger();}
}
/*** 坦克的具体工厂角色:* 专门生产坦克的工厂*/
public class TankFactory implements WeaponFactory{@Overridepublic Weapon get() {return new Tank();}
}

客户端测试

在这里插入图片描述
在这里插入图片描述

package com.rainbowsea.test;import com.rainbowsea.bean.DaggerFactory;
import com.rainbowsea.bean.TankFactory;
import com.rainbowsea.bean.Weapon;
import com.rainbowsea.bean.WeaponFactory;public class Test {public static void main(String[] args) {// 我们需要匕首// 调用匕首的工厂,进行生产WeaponFactory weaponFactory = new DaggerFactory();Weapon weapon = weaponFactory.get();weapon.attack();  // 匕首攻击// 我们需要坦克// 调用坦克的工厂,进行生产WeaponFactory weaponFactory2 = new TankFactory();Weapon weapon2 = weaponFactory2.get();weapon2.attack();  // 坦克攻击}
}

这种简单工厂模式,如果想扩展一个新的产品,只要新增一个产品类,再新增一个该产品对应的工厂即可,例如新增:战斗机

在这里插入图片描述

在这里插入图片描述

从中,我们可以看出,在进行功能扩展的时候,不需要修改之前的源代码(仅仅是添加了,扩展的类,对象而已,并没有修改),显然工厂方法模式符合OCP原则(修改关闭,扩展打开)。

1.4.1 工厂方法模式的优缺点:

工厂方法模式的优点:

    1. 一个调用者想创建一个对象,只要知道其名称就可以了。
    2. 扩展性高,如果想要增加一个产品,只需要扩展该产品的一个工厂类就可以了
    3. 同时屏幕产品的具体实现(运用多态机理),调用者只关心产品的接口

工厂方法模式的缺点:

每次增加一个新产品时,都需要增加一个具体类和对象实现工厂,使得系统种类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事情。

1.5 抽象工厂模式

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。
抽象工厂模式特点:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。
抽象工厂中包含4个角色:

    • 抽象工厂角色
    • 具体工厂角色
    • 抽象产品角色
    • 具体产品角色

抽象工厂模式的类图如下:

在这里插入图片描述

抽象工厂模式代码如下:
第一部分:武器产品族

package com.powernode.product;/*** 武器产品族* @author 动力节点* @version 1.0* @className Weapon* @since 1.0**/
public abstract class Weapon {public abstract void attack();
}
package com.powernode.product;/*** 武器产品族中的产品等级1* @author 动力节点* @version 1.0* @className Gun* @since 1.0**/
public class Gun extends Weapon{@Overridepublic void attack() {System.out.println("开枪射击!");}
}
package com.powernode.product;/*** 武器产品族中的产品等级2* @author 动力节点* @version 1.0* @className Dagger* @since 1.0**/
public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("砍丫的!");}
}

第二部分:水果产品族

package com.powernode.product;/*** 水果产品族* @author 动力节点* @version 1.0* @className Fruit* @since 1.0**/
public abstract class Fruit {/*** 所有果实都有一个成熟周期。*/public abstract void ripeCycle();
}
package com.powernode.product;/*** 水果产品族中的产品等级1* @author 动力节点* @version 1.0* @className Orange* @since 1.0**/
public class Orange extends Fruit{@Overridepublic void ripeCycle() {System.out.println("橘子的成熟周期是10个月");}
}
package com.powernode.product;/*** 水果产品族中的产品等级2* @author 动力节点* @version 1.0* @className Apple* @since 1.0**/
public class Apple extends Fruit{@Overridepublic void ripeCycle() {System.out.println("苹果的成熟周期是8个月");}
}

第三部分:抽象工厂类

package com.powernode.factory;import com.powernode.product.Fruit;
import com.powernode.product.Weapon;/*** 抽象工厂* @author 动力节点* @version 1.0* @className AbstractFactory* @since 1.0**/
public abstract class AbstractFactory {public abstract Weapon getWeapon(String type);public abstract Fruit getFruit(String type);
}

第四部分:具体工厂类

package com.powernode.factory;import com.powernode.product.Dagger;
import com.powernode.product.Fruit;
import com.powernode.product.Gun;
import com.powernode.product.Weapon;/*** 武器族工厂* @author 动力节点* @version 1.0* @className WeaponFactory* @since 1.0**/
public class WeaponFactory extends AbstractFactory{public Weapon getWeapon(String type){if (type == null || type.trim().length() == 0) {return null;}if ("Gun".equals(type)) {return new Gun();} else if ("Dagger".equals(type)) {return new Dagger();} else {throw new RuntimeException("无法生产该武器");}}@Overridepublic Fruit getFruit(String type) {return null;}
}
package com.powernode.factory;import com.powernode.product.*;/*** 水果族工厂* @author 动力节点* @version 1.0* @className FruitFactory* @since 1.0**/
public class FruitFactory extends AbstractFactory{@Overridepublic Weapon getWeapon(String type) {return null;}public Fruit getFruit(String type){if (type == null || type.trim().length() == 0) {return null;}if ("Orange".equals(type)) {return new Orange();} else if ("Apple".equals(type)) {return new Apple();} else {throw new RuntimeException("我家果园不产这种水果");}}
}

第五部分:客户端程序

package com.powernode.client;import com.powernode.factory.AbstractFactory;
import com.powernode.factory.FruitFactory;
import com.powernode.factory.WeaponFactory;
import com.powernode.product.Fruit;
import com.powernode.product.Weapon;/*** @author 动力节点* @version 1.0* @className Client* @since 1.0**/
public class Client {public static void main(String[] args) {// 客户端调用方法时只面向AbstractFactory调用方法。AbstractFactory factory = new WeaponFactory(); // 注意:这里的new WeaponFactory()可以采用 简单工厂模式 进行隐藏。Weapon gun = factory.getWeapon("Gun");Weapon dagger = factory.getWeapon("Dagger");gun.attack();dagger.attack();AbstractFactory factory1 = new FruitFactory(); // 注意:这里的new FruitFactory()可以采用 简单工厂模式 进行隐藏。Fruit orange = factory1.getFruit("Orange");Fruit apple = factory1.getFruit("Apple");orange.ripeCycle();apple.ripeCycle();}
}

执行结果:
img

1.6 抽象工厂模式的优缺点:

    • 优点: 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    • 缺点: 产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码。

2. 总结:

  1. 23种设计模式:

    1. 创建型(5个):解决对象创建问题。
    2. 结构型 (7个):一些类或对象组合在一起的经典结构
    3. 行为型 (11个):解决类或对象之间的交互问题。
  2. 简单工厂模式(静态工厂模式),需要注意是:一个静态方法,所以被称之为”静态工厂模式“,不属于23种设计模式。同时需要注意:简单工厂的一个上帝类和(违背了OCP原则(修改关闭,苦扩展打开)) 的问题。注意其中的优点和缺点,灵活使用。

  3. 工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点**(类爆炸问题)**。工厂方法模式(不是静态方法了,是实例方法)。同时其中的优点和缺点,灵活使用。

  4. 抽象工厂模式(解决了工厂方法模式的,类爆炸问题)抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。其中的优点和缺点,灵活使用。

  5. 灵活使用工厂模式的三种形态,处理现实当中的业务需求。

3. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…

C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点

类与对象(上):C初阶学习第三弹——类与对象(上)——初始类与对象-CSDN博客 前言: 在前面文章中,我们已经讲了类与对象的思想和类与对象的一些基本操作,接下来这篇文章我们将讲解以下…

探索Jellyfin:支持Android的自由开源的媒体服务器平台

探索Jellyfin:支持Android的自由开源的媒体服务器平台 I. 简介 A. 什么是Jellyfin? Jellyfin是一个自由开源的媒体服务器平台,旨在让用户能够自主管理和流式传输他们的媒体内容。与许多闭源的商业媒体服务器解决方案不同,Jelly…

Matlab各个版本介绍、区别分析及推荐

MATLAB,由美国MathWorks公司出品,是一款广泛应用的商业数学软件。自其诞生之初,MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域,赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

ubuntu neo4j 下载与配置(一)

neo4j 官方下载页面 https://neo4j.com/deployment-center/#community 进入页面之后,往下滑 咱们在下载neo4j时,官方可能要咱们填写一下个人信息,比如:姓名组织结构邮箱等: 咱们可以观察一下,ne4j的下载链…

如何下载钉钉群直播回放:完整步骤解析

在当今快节奏的商业和教育环境中,钉钉群直播已经成为了沟通和学习的重要工具。直播结束后,很多观众都希望回顾内容,但却不知如何开始。如果你错过了实时直播,或者只是想再次观看精彩的演讲和讨论,那么下载钉钉群直播回…

基于ESP32—CAM物联网WIFI小车

一.功能概述 摄像头的画面可以实时的传输到,点灯科技APP的手机端,这样可以实时查看周围环境的状况,灯光不足,画面不清晰时可以打开灯光照明。手机端有左转、右转、前进、后退、停止的按钮。可以根据自己需要,来控制小车…

GitHub Copilot申请和使用

GitHub Copilot申请和使用 文章目录 前言一、申请二、使用总结 前言 之前已经成功进行了Github学生认证,今天邮件通知之前的学生认证已经通过。那么就去进行GitHub Copilot申请和使用。 前面准备:Github学生认证 一、申请 进入github的settings&#x…

Eclipse:-Dmaven.multiModuleProjectDirectory system propery is not set.

eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 可以设一个环境变量M2_HOME指向你的maven安装目录 M2_HOMED:\Apps\…

Deckset for Mac激活版:MD文档转幻灯片软件

Deckset for Mac是一款专为Mac用户打造的Markdown文档转幻灯片软件。它凭借简洁直观的界面和强大的功能,成为许多用户的心头好。 Deckset for Mac激活版下载 Deckset支持Markdown语法,让用户在编辑文档时无需分心于复杂的格式设置,只需专注于…

【docker 】Windows10安装 Docker

安装 Hyper-V Hyper-V 是微软开发的虚拟机,仅适用于 Windows 10。 按键: win键X ,选着程序和功能 在查找设置中输入:启用或关闭Windows功能 选中Hyper-V 点击确定 安装 Docker Desktop for Windows Docker Desktop 官方下载…

2024年 Java 面试八股文——Redis篇

目录 1、介绍下Redis Redis有哪些数据类型 难度系数:⭐ 2、Redis提供了哪几种持久化方式 难度系数:⭐ 3、Redis为什么快 难度系数:⭐ 4、Redis为什么是单线程的 难度系数:⭐ 5、Redis服务器的的内存是多大…

pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的,B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx接口处存在文件读取漏洞,未经身份认证的攻击者可以利用漏洞读…

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日,北京星辰天合科技股份有限公司(简称:XSKY 星辰天合)与杭州云猿生数据有限公司(简称“云猿生”)完成了产品互兼容认证,星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

机器学习:逻辑回归

概念 首先,逻辑回归属于分类算法,是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内,hθ(x)越接近1越有可能是正例,反之,越接近0越有可能是负例。那么&am…

C# wpf 运行时替换方法实现mvvm自动触发刷新

文章目录 前言一、如何实现?1、反射获取属性2、定义替换方法3、交换属性的setter方法 二、完整代码1、接口2、项目 三、使用示例1、倒计时(1)、继承ViewModelBase(2)、定义属性(3)、属性赋值&am…

iOS 创建依赖其他开源库的开源库

参考文章(感激各位大神前路的明灯) 参考文章一 参考项目 整体流程 流程简介 1)使用pod命令行创建本地项目和git仓库并回答终端里的四个问题 2)编辑podspec文件 3)将需要开源的代码添加到Development Pods文件夹中&am…

iOS 实现类似抖音翻页滚动效果

这里是效果图 参考抖音的滚动效果,需要我们在结束拖动的时候,动画设置偏移量 这里有一个注意点,由于我们是在拖动结束的时候,手动改变tableview的偏移量, 改变了tableView 自身原有的的滚动效果,所以我们…

近几年视频取证、视频篡改检测技术发展现状及挑战

前言 本文主要搜集了视频取证各个子领域近几年的高影响因子/引用数的文章及其主要思想和做法,旨在分析目前视频篡改检测的发展现状与热点领域,文章中也融合了自己的一点看法和展望,欢迎感兴趣的同学和我多多沟通。 本文无论是文献搜集还是方…

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的? 1. tcpdump抓包架构2. BPF介绍3. 从内核层面看tcpdump抓包流程3.1. 创建socket套接字3.2. 挂载BPF程序 4. 网络收包抓取5. 网络发包抓取6. 疑问和思考6.1 tcpdump抓包跟网卡、内核之间的顺序…