java抽象工厂实战与总结
文章目录
- 一、工厂模式(三种)
- 1.简单工厂模式
- 1.1 概念:
- 1.2 `使用场景`:
- 1.3 模型图解:
- 1.4 伪代码:
- 2.工厂方法模式
- 2.1 概念:
- 2.2 `使用场景`:
- 2.3 模型图解:
- 2.4 伪代码
- 3.抽象工厂模式
- 3.1 概念
- 3.2 `使用场景`
- 3.3 模型图解:以两层模型做例子
- 3.4 伪代码
- 3.4.1 以品牌角度设计工厂
- 3.4.2 以手机角度设计工厂
- 3.5 实战:抽象工厂 + 简单工厂模式 +策略模式
- 3.5.1 业务方法调用
- 3.5.2 抽象工厂创建二级工厂,定义获取业务对象接口(二级工厂去创建具体的业务对象)
- 3.5.3 二级工厂 获得对象
- 3.5.3 二级工厂 具体的业务对象
- 3.5.3 处理的业务
- 补充:6大设计原则
- 3.6 总结:
一、工厂模式(三种)
1.简单工厂模式
1.1 概念:
通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。
隐藏了对象的创建细节,客户端只需通过工厂类获取对象而不需要直接实例化对象。
1.2 使用场景
:
使用者:根据不同的参数或条件返回相应的对象实例
1.3 模型图解:
角色:手机总工厂、参数、手机、小米手机、华为手机
后续补充:
1.4 伪代码:
public class SimpleFactoryTest {static class SimpleFactory {static SimpleFactoryTest.Mobile createMobile(int mobileType) throws Exception {if (mobileType == 1) {return new SimpleFactoryTest.HuaWei();} else if (mobileType == 2) {return new SimpleFactoryTest.XiaoMi();} else {throw new Exception("手机类型不存在!!!");}}}public static class Mobile {protected void call() {System.out.println("mobile...");}}public static class HuaWei extends Mobile {public void call() {System.out.println("huaWei...");}}public static class XiaoMi extends Mobile {public void call() {System.out.println("xiaomi...");}}public static void main(String[] args) throws Exception {SimpleFactoryTest.Mobile mobile = SimpleFactory.createMobile(1);mobile.call();}
}
2.工厂方法模式
2.1 概念:
定义了一个创建对象的接口,具体对象的创建由对象工厂决定。
使得对象的创建延迟到子类工厂,从而实现了对扩展开放、对修改关闭的原则。
2.2 使用场景
:
使用者:根据不同的子工厂创建相应的对象实例
2.3 模型图解:
角色:手机总工厂、小米手机工厂、华为手机工厂、手机、小米手机、华为手机
后续补充
2.4 伪代码
public class FactoryMethodTest {interface FactoryMethod {Mobile createMobile();}static class HuaweiFactory implements FactoryMethod {@Overridepublic Mobile createMobile() {return new Huawei();}}static class XiaomiFactory implements FactoryMethod {@Overridepublic Mobile createMobile() {return new Xiaomi();}}static class Mobile {protected void call() {System.out.println("mobile...");}}static class Huawei extends Mobile {@Overridepublic void call() {System.out.println("huawei...");}}static class Xiaomi extends Mobile {@Overridepublic void call() {System.out.println("xiaomi...");}}public static void main(String[] args) {final HuaweiFactory huaweiFactory = new HuaweiFactory();final Mobile mobile = huaweiFactory.createMobile();mobile.call();}
}
3.抽象工厂模式
3.1 概念
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象。
通过使用抽象工厂及其产品接口来创建对象,从而将客户端与具体的产品实现解耦。
3.2 使用场景
适用:三层关系
产品 | 品牌 | 子品牌 |
---|---|---|
手机 | 华为手机 | Mate60 / P60手机 …等 |
手机 | 小米手机 | 红米 / Note2 手机 … 等 |
适用:两层关系
产品 | 品牌 |
---|---|
手机 | 华为 |
电脑 | 小米 |
3.3 模型图解:以两层模型做例子
角色::总工厂、小米工厂、华为工厂、小米手机、华为手机、小米路由器、华为路由器
3.4 伪代码
3.4.1 以品牌角度设计工厂
/*** descr: 以品牌角度设计工厂** @date: 2024/1/24**/
public interface AbstractFactory {Phone createPhone();Computer createComputer();class HuaweiFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new HuaweiPhone();}@Overridepublic Computer createComputer() {return new HuaweiComputer();}}class XiaomiFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new XiaomiPhone();}@Overridepublic Computer createComputer() {return new XiaomiComputer();}}class HuaweiPhone implements Phone {@Overridepublic void call() {System.out.println("huawei call...");}}class HuaweiComputer implements Computer {@Overridepublic void play() {System.out.println("huawei play...");}}class XiaomiPhone implements Phone {@Overridepublic void call() {System.out.println("xiaomi play...");}}class XiaomiComputer implements Computer {@Overridepublic void play() {System.out.println("xiaomi play...");}}interface Phone {void call();}interface Computer {void play();}
}
3.4.2 以手机角度设计工厂
代码目录结构:
1.测试类 及常量类
1.1 测试类
/*** descr** @author: bjh* @date: 2024/1/27**/
public class AbstractFactoryTest {public static void main(String[] args) {doBiz(Constant.BRAND_HUAWEI, Constant.MODEL_HUAWEI_MATE60);doBiz(Constant.BRAND_XIAOMI, Constant.MODEL_XIAOMI_K20);}/*** 业务方法:** @param brand 品牌* @param modelName 机型*/public static void doBiz(String brand, String modelName) {final AbstractFactory factory = AbstractFactory.getFactory(brand);final Phone phone = factory.createPhone(modelName);phone.call();}}
1.2 常量类
/*** descr:便于管理和维护魔法值** @author: bjh* @date: 2024/1/27**/
public interface Constant {String BRAND_HUAWEI = "huawei";String BRAND_XIAOMI = "xiaomi";String MODEL_HUAWEI_MATE60 = "mate60";String MODEL_HUAWEI_P20 = "p20";String MODEL_XIAOMI_K20 = "k20";
}
2.抽象工厂
/*** descr: 抽象总工厂;* 1.采用简单工厂方法模式获得二级工厂* 2.定义创建手机的接口方法** @author: bjh* @date: 2024/1/26**/
public abstract class AbstractFactory {public abstract Phone createPhone(String modalName);public static AbstractFactory getFactory(String brand) {// 此处三木运算符使用不严谨,实际编码不建议这样写return Constant.BRAND_HUAWEI.equals(brand) ? new HuaweiPhoneFactory() : new XiaomiPhoneFactory();}
}
3.二级工厂(实际工厂)
3.1 华为手机工厂
/*** descr: 华为手机工厂,生成华为手机** @author: bjh* @date: 2024/1/27**/
public class HuaweiPhoneFactory extends AbstractFactory {@Overridepublic Phone createPhone(String modalName) {// 此处三木运算符使用不严谨,实际编码不建议这样写return Constant.MODEL_HUAWEI_MATE60.equals(modalName) ? new Mate60Phone() : new P20Phone();}
}
3.2 小米手机工厂
/*** descr** @author: bjh* @date: 2024/1/27**/
public class XiaomiPhoneFactory extends AbstractFactory {@Overridepublic Phone createPhone(String modalName) {// 此处写法不严谨,实际编码不建议这样写return new K20Phone();}
}
4.抽象手机
/*** descr:手机产品** @author: bjh* @date: 2024/1/26**/
public abstract class Phone {// 机型名称protected String modelName;// 是否支持卫星通话:小米不支持,华为支持protected Boolean satellitePhone;// 公有业务方法:策略模式abstract public void call();
}
5.华为抽象手机与小米抽象手机
5.1 华为抽象手机
/*** descr:抽象的华为手机,定义华为手机特有的业务** @author: bjh* @date: 2024/1/26**/
public abstract class HuaweiPhone extends Phone {// 定义华为手机相关业务: 拨打卫星电话protected abstract void callSatellite();// 支持卫星电话private Boolean satellitePhone = true;
}
5.2 小米抽象手机
/*** descr:抽象的小米手机,定义小米手机特有的业务** @author: bjh* @date: 2024/1/26**/
public abstract class XiaomiPhone extends Phone {//小米手机便宜protected String cheap = "有点便宜!";//不支持卫星电话private Boolean satellitePhone = false;
}
- 实际手机产品:mate60、p20、k20
6.1 mate60
/*** descr 实际华为产品:mate60** @author: bjh* @date: 2024/1/27**/
public class Mate60Phone extends HuaweiPhone {private String modelName = "华为mate60";@Overridepublic void call() {System.out.println(this.modelName + "拨打电话...");}@Overrideprotected void callSatellite() {System.out.println(this.modelName + " >> 拨打卫星电话");}
}
6.2 p20
/*** descr 实际华为产品:P20** @author: bjh* @date: 2024/1/27**/
public class P20Phone extends HuaweiPhone {private String modelName = "华为P20";@Overridepublic void call() {System.out.println(this.modelName + "拨打电话...");}@Overrideprotected void callSatellite() {System.out.println(this.modelName + ">> 拨打卫星电话");}
}
6.3 k20
/*** descr 实际小米产品:K20** @author: bjh* @date: 2024/1/27**/
public class K20Phone extends XiaomiPhone {private String modelName = "小米K20";@Overridepublic void call() {// 抽取变量提高代码可维护性,HashMap源码中有类似这样写法String modalName = this.modelName;System.out.println(modalName + super.cheap);System.out.println(modalName + "拨打电话...");}
}
3.5 实战:抽象工厂 + 简单工厂模式 +策略模式
代码目录结构:
3.5.1 业务方法调用
/*** 根据业务类型计算真正需要动账的存欠类型** @param materialInboundDO* @param walletTypeAndWeight* @return*/private Map<String, BigDecimal> doBizType(MaterialInboundDO materialInboundDO, Map<String, BigDecimal> walletTypeAndWeight) {final AbstractFactory factory = AbstractFactory.getFactory(materialInboundDO.getBillType());final MaterialWalletHandler materialInboundBean = factory.getMaterialInboundOutboundBean(materialInboundDO.getBizType());return materialInboundBean.doBizType(walletTypeAndWeight);}
3.5.2 抽象工厂创建二级工厂,定义获取业务对象接口(二级工厂去创建具体的业务对象)
/*** 抽象工厂解决供应商/客户来料不同的业务类型对客户钱包的动账变化** @date: 2023/7/18**/
public abstract class AbstractFactory {/*** 获得单据类型工厂** @param billType 单据类型* @return*/public static AbstractFactory getFactory(String billType) {if (BillTypeEnum.MATERIAL_CUSTOMER_IN.getKey().equals(billType)) {return new InboundCustomerFactory();} else if ( BillTypeEnum.MATERIAL_SUPPLIER_IN.getKey().equals(billType)) {return new InboundSupplierFactory();} else if (BillTypeEnum.MATERIAL_CUSTOMER_OUT.getKey().equals(billType)) {return new OutboundCustomerFactory();} else if (BillTypeEnum.MATERIAL_SUPPLIER_OUT.getKey().equals(billType)) {return new OutboundSupplierFactory();}throw new ServiceException("原料业务工厂不存在");}/*** 获得业务对象** @param bizType 业务类型* @return*/public abstract MaterialWalletHandler getMaterialInboundOutboundBean(String bizType);
}
3.5.3 二级工厂 获得对象
/*** descr 客户来料工厂** @date: 2023/7/18**/
public class InboundCustomerFactory extends AbstractFactory {@Overridepublic InboundCustomerHandler getMaterialInboundOutboundBean(String bizType) {if (BizTypeEnum.M_CUSTOMER_IN.getKey().equals(bizType)) {return new InboundCustomerIn();}throw new ServiceException("客户来料业务类型不存在");}
}
3.5.3 二级工厂 具体的业务对象
/*** descr 客户:客户来料** @date: 2023/7/18**/
public class InboundCustomerIn implements InboundCustomerHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {return walletTypeAndWeight;}
}
3.5.3 处理的业务
顶层接口,如下子业务处理方式
/*** descr 来料/出料业务定义接口** @date: 2023/7/18**/
public interface MaterialWalletHandler {Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight);}
中间层子接口之一:用于规范业务
/*** descr 客户来料接口** @date: 2023/7/18**/
public interface InboundCustomerHandler extends MaterialWalletHandler {}
中间层接口实现1:用于处理业务
/*** descr 客户:客户来料** @date: 2023/7/18**/
public class InboundCustomerIn implements InboundCustomerHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {return walletTypeAndWeight;}
}
中间层接口实现2:用于处理业务
/*** descr 供应商:发料兑料** @date: 2023/7/18**/
public class OutboundSupplierMix implements OutboundSupplierHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {final HashMap<String, BigDecimal> walletTypeAndWeightMap = new HashMap<>(walletTypeAndWeight);walletTypeAndWeightMap.remove(WalletTypeEnum.CASH.getKey());return walletTypeAndWeightMap;}
}
补充:6大设计原则
1.单一职责
2.开放封闭
3.接口隔离
4.里氏替换
5.依赖倒置
6.迪米特法则
转送:
java常用设计模式
3.6 总结:
- 以上实战中,代码没有写的很完美,还有许多改善的地方
- 抽象工厂在实际运用中比一般都例子都相对复杂;或可能写的理解的有所欠缺
- 抽象工厂定义了对象怎么创建;策略模式定义了业务怎么实现
- 一般抽象工厂模式都想要依托简单工厂或工厂方法模式创建二级工厂;在实践中一般会搭配策略模式或模板方法模式去处理相关业务
- 设计模式的使用主要是对业务代码进行简化或抽象,尽量符合6大设计原则;在技术人员沟通中,只要说出某种设计模式,就能知道业务大概是怎么处理的,极大的减少了沟通成本
相关文章:

java抽象工厂实战与总结
文章目录 一、工厂模式(三种)1.简单工厂模式1.1 概念:1.2 使用场景:1.3 模型图解:1.4 伪代码: 2.工厂方法模式2.1 概念:2.2 使用场景:2.3 模型图解:2.4 伪代码 3.抽象工厂…...
Compose | UI组件(六) | 选择框
文章目录 前言Checkbox 复选框的含义Checkbox 复选框的使用Switch 单选框的含义Switch 单选框的使用Slider 滑竿组件的含义Slider 滑竿组件的使用 总结 前言 随着移动端的技术不断更新迭代,Compose也运用的越来越广泛,很多人都开始学习Compose 本文主要…...

C++拷贝构造函数、赋值学习整理:
拷贝构造函数: 概念: 构造函数的第一个参数,是类本身的const引用(一般情况下没有其他参数,少数情况:其他参数必须有默认值!)称此类构造函数为拷贝构造函数 特征: 1&am…...

[亲测源码]ps软件网页版在线使用 PS网站程序源码 photoshop网页版源码 网页版的ps软件源码
在线PS作图修图网页版PHP网站源码,PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的,众所周知在使用和学习PS时是需要下载软件的,Photoshop软件对电脑配置也是有一定要求的,今天就为大家带来一…...

前端大厂面试题探索编辑部——第二期
目录 题目 单选题1 题解 关于TCP 关于UDP 单选题2 题解 A选项的HTTP是否是无状态协议 B选项的HTTP支持的方法 C选项的关于HTTP的状态码 D选项HTTP协议的传输格式 题目 单选题1 1.以下哪个描述是关于 TCP 和 UDP 的区别() A. TCP 是无连接的…...
yaml学习笔记
文章目录 yaml语言学习yaml 简介yaml 和json 区别基本语法数据类型YAML 对象YAML 数组锚点和引用纯量 参考文档 yaml语言学习 最近发现在学习k8s中各种配置文件 都是使用的yaml 这种格式, 包括 docker-compose.yaml 也都是用这个格式配置部署项目信息,我就了解了一下这个语法就…...

深度强化学习(王树森)笔记04
深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...
openssl3.2/test/certs - 074 - CT entry
文章目录 openssl3.2/test/certs - 074 - CT entry概述笔记setup074.shsetup074_sc1.shsetup074_sc2.shsetup074_sc3.shEND openssl3.2/test/certs - 074 - CT entry 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 setup074.sh #! /bin/bash# \file setup074.sh# o…...

Angular组件(一) 分割面板ShrinkSplitter
Angular组件(一) 分割面板ShrinkSplitter 前言 分割面板在日常开发中经常使用,可将一片区域,分割为可以拖拽整宽度或高度的两部分区域。模仿iview的分割面板组件,用angular实现该功能,支持拖拽和[(ngModel)]双向绑定的方式控制区…...
抖音详情API:视频内容获取与解析技巧
一、引言 抖音是一款广受欢迎的短视频分享平台,每天都有大量的用户在抖音上分享自己的生活点滴和创意作品。对于开发者而言,如何获取并解析抖音上的视频内容,是一项极具挑战性的任务。本文将详细介绍抖音详情API,以及如何使用它来…...
SpringBoot中实现阿里云OSS对象存储
背景 在业务中我们往往需要上传文件如图片,文件上传,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件…...

大型语言模型 (LLM)全解读
一、大型语言模型(Large Language Model)定义 大型语言模型 是一种深度学习算法,可以执行各种自然语言处理 (NLP) 任务。 大型语言模型底层使用多个转换器模型, 底层转换器是一组神经网络。 大型语言模型是使用海量数据集进行训练…...

Unity - gamma space下还原linear space效果
文章目录 环境目的环境问题实践结果处理要点处理细节【OnPostProcessTexture 实现 sRGB 2 Linear 编码】 - 预处理【封装个简单的 *.cginc】 - shader runtime【shader需要gamma space下还原记得 #define _RECOVERY_LINEAR_IN_GAMMA】【颜色参数应用前 和 颜色贴图采样后】【灯…...

Rabbitmq调用FeignClient接口失败
文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…...

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信
今年专业838信号与系统120,总分400,顺利上岸海南大学,这一年的复习起起伏伏,但是最后还是坚持下来的,吃过的苦都是值得,总结一下自己的复习经历,希望对大家复习有帮助。首先我想先强调一下专业课…...
如何区分 html 和 html5?
HTML(超文本标记语言)和HTML5在很多方面都存在显著的区别。HTML5是HTML的最新版本,引入了许多新的特性和元素,以支持更丰富的网页内容和更复杂的交互。以下是一些区分HTML和HTML5的关键点: 新特性与元素:H…...

Ps:将文件载入堆栈
Ps菜单:文件/脚本/将文件载入堆栈 Scripts/Load Files into Stack 将文件载入堆栈 Load Files into Stack脚本命令可用于将两个及以上的文件载入到同一个 Photoshop 新文档中。 载入的每个文件都将成为独立的图层,并使用其原始文件名作为图层名。 Photos…...

【格密码基础】:补充LWE问题
目录 一. LWE问题的鲁棒性 二. LWE其他分布选择 三. 推荐文献 四. 附密码学人心中的顶会 一. LWE问题的鲁棒性 robustness,翻译为鲁棒性 已有的论文表明,及时敌手获取到部分关于秘密和error的信息,LWE问题依旧是困难的,这能…...

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式:2. C11方式: 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中࿰…...

VMware虚拟机部署Linux Ubuntu系统
本文介绍基于VMware Workstation Pro虚拟机软件,配置Linux Ubuntu操作系统环境的方法。 首先,我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是,VMware Workstation Pro软件是一个收费软件,而互联网中有很…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...