首页 文章 精选 留言 我的

精选列表

搜索[腾讯极客挑战赛],共10001篇文章
优秀的个人博客,低调大师

设计模式之工厂三剑客

谈及设计模式,大多数人首先会想到工厂模式,但是,工厂模式到底是啥?以及简单工厂模式、工厂方法模式、抽象工厂模式之间的区别是什么?恐怕,就很少有人说的清了! 今天,说说自己对工厂模式的一些浅见!我们先了解各个模式的定义及其使用场景,最后对三种模式进行比较分析。 1 简单工厂模式 1.1 定义 简单工厂,提供一个创建对象的功能,而无需关心该对象的具体实现。 1.2 设计初衷 一句话:给你鸡蛋吃,请不要问我是哪只鸡生的!简单工厂和它所创建的对象通常在一个包内,对象的结构组成对简单工厂是可见,但对客户端(client)而言,它是不清楚对象结构的,只需要通过简单工厂拿到对象,并使用它。 1.3简单工厂结构说明 2 工厂方法模式:Golang不需要它 2.1 定义 工厂方法模式的主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用;而具体的实现延迟到子类中来实现。 2.2 设计初衷 我不关心你是谁,你只要跟着我的指挥棒转动即可。工厂方法模式中的父类定义了转动逻辑,而其子类则通过工厂方法制定了转动执行者。 工厂方法模式很好地体现了“依赖倒置原则”,要依赖抽象,不要依赖于具体类。 2.3工厂方法模式结构 2.4 Golang实现工厂方法模式 在我看来,用Golang实现工厂方法,就是脱裤子放屁,Operate函数直接操作Product即可,无需定义Creator类。 问题:为什么Operate要以函数形式存在,而不是Creator的方法呢? 答:Golang没有继承,虽然能通过匿名成员(嵌入结构体)实现继承功能,但匿名成员却拿不到factoryMethod产生的ConcreteProduct。 2.5Golang为什么不需要工厂方法? 在Java中,函数是寄存在类内的,因此必须定义一个父类来实现Operate方法;而在Golang中,函数是在结构体之外的,Operate无需寄存于结构体中。 3 抽象工厂模式 3.1 定义 抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体实现。 3.2 设计初衷 你无法在肯德基喝可口可乐!与其说,抽象工厂是封装一组相互依赖对象的接口,倒不如说,抽象工厂是限定了相互依赖对象的接口组合种类,比如,同样是快餐抽象工厂,它只会有“肯德基+百事可乐”和“麦当劳+可口可乐”两种具体工厂。 3.3 抽象工厂模式结构 3.4 抽象工厂模式的调用顺序 3.5Golang中抽象工厂,是不是与工厂方法一样,多此一举呢? NO!抽象工厂提供多个产品的创建接口,所以,创建工厂类,就不再是多此一举,因为,脱裤子不再是放屁一件事情,还可以做其他的事情(脑补一下,画面太污)。 4 比较 本文分享自微信公众号 - DevOps技术说(sli4book)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

牛客网输入规范总结(c++部分)

注意:输入的多组输入,不是一组,已经猜了很多次坑了哦! 输入 预先不输入数据的组数 while(cin>>a>>b){ cout<<a+b<<endl; } 预先知道数据组数 cin>>n; for(int i=0; i<n; i++){ int a,b; cin>>a>>b; cout<<a+b<<endl; } 只有一组数据 cin>>a>>b; cout<<a+b<<endl; 输出 不需要输出case数 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<a+b<<endl; } 需要输出case数 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<"Case"<<i+1<<a+b<<endl; } 每个case之后有空行 for(int i=0; i<n; i++){ int a, b; cin>>a>>b; cout<<"Case"<<i+1<<a+b<<endl<<endl; } 两个Case之间有空行 cin>>n; for(int i=0; i<n; i++){ int a, b; cin>>a>>b; if(i>0){ cout<<endl; } cout<<"Case"<<i+1<<a+b<<endl; } 处理细节和技巧 输入 不用保存所有组的输入,读一组算一组 “可恶”的字符串——带空白 scanf, cin之类都读到空白结束 gets, cin.getline。再自己parse 用scanf, gets代替cin。 输出 注意格式 字母大小写 什么时候换行 输出“case”后面有没有“#”或者“:”之类。 每行末尾有\n,但一般没有空白 用printf代替cout。 OJ常见状态 内存超限——使用内存过多 返回非零——main函数返回了非零值 浮点错误——除以零 运行错误——指针乱指 段错误——指针越界

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册