精华内容
下载资源
问答
  • 代码设计原则
    万次阅读
    2021-05-13 20:48:47

    SOLID原则

    s:single resp 单一职责原则:

    What:是什么?
    一个类仅仅只负责完成一个职责或者功能
    Why:为什么 ?
    避免将不相关的功能耦合在一起,提高类,模块,的内聚
    How:什么时候地方会有坏味道?

    1. 类中的代码行数,方法或者属性过多,上帝类等
    2. 类依赖的其他类过多,或者依赖类的其他类过多
    3. 私有方法过多
    4. 比较难给类起一个合适的名字
    5. 类中大量的方法都是集中操作类中的某几个属性
      When:应用场景?
      主要针对是模块的分类,module,设计,类的设计,接口设计是否足够单一

    o:opein closed 开闭原则

    What:是什么?
    添加一个新的功能,应该是通过在已有代码的基础上扩张代码,(新增模块,类,方法,属性等),而非修改已有代码,的方式来完成
    Why:什么时候地方会有坏味道?

    1. 第一点需要注意的是:开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发
    2. 第二点需要注意的是:同样的代码改动,在粗代码粒度下,可能被认定为“”“修改”;但是,在细代码粒度下,可能又被认定为“”“扩展”;

    How:怎么做 ?
    如何做到 对扩展开放,对修改关闭呢?

    1. 我们要时刻具备扩展意识,抽象意识,封装意识
    2. 在写代码的时候,我们要多花时间思考一下,这段代码未来可能有哪些需求变更,与产品业务保持沟通,如何设计代码结构,事先留好扩展点

    When:应用场景?
    以后修改代码,涉及到模块,类,方法

    l:liskov 里氏替换原则**

    What:是什么?
    子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变 , 以及正确性不被破坏

    How:怎么做 ?

    1. 按照协议来设计
    2. 里氏替换原则是用来指导继承关系中子类该如何设计的一个原则

    Where:什么时候地方会有坏味道?

    When:应用场景?
    里氏替换是一种设计原则,用来指导继承关系中子类该如何设计,子类的设计要保证在替换父类的时候,不改变原有逻辑并且不破坏原有程序的正确性

    i:接口隔离原则**

    What:是什么?
    客户端不应该强迫依赖他不需要的接口,接口要足够恰到好处,不大也不小

    How:怎么做 ?
    接口隔离原则提供了一种判断接口的职责是否单一的标准:通过调用者如何使用接口来间接来判定。如果调用者仅仅使用部分接口或接口的部分功能,那接口的设计就不够职责单一。

    Where:什么时候地方会有坏味道?

    When:应用场景?:接口设计上

    d:依赖倒置原则**

    TODO 这里不大明白,要重新学习。。待补充
    What:是什么?
    控制反转:控制指的是对程序执行流程的控制,在使用框架之后,整个程序的执行流程通过框架来控制。流程的控制权从程序员反转给了框架
    依赖注入:
    依赖注入框架:spring,google juice
    我们通过依赖注入框架提供的扩展点,简单配置一下所有需要的类及其类与类之间的依赖关系,就可以实现由框架来自动创建对象,管理对象的生命周期,依赖注入等原本需要程序员来做的事情

    How:怎么做 ?
    Where:什么时候地方会有坏味道?
    When:应用场景?

    LOD 迪米特 最少知识原则:

    如何理解高内聚,低耦合?

    1. 高内聚用来指导类本身的设计,在设计类的时候判断类是否足够的内聚
    2. 松耦合用来指导类与类之间依赖关系的设计
    3. 所谓高内聚,指的是相近的功能应该放到同一个类中,不相近的功能不要放到同一类中

    DRY原则 – 不要重复原则

    What:是什么?

    什么是重复的原则?

    How:怎么做 ?

    Where:什么时候地方会有坏味道?

    When:应用场景?

    YAGNI原则 – 是 kiss 简单原则 好像 相违背

    YAGNI原则(You Ain’t Gonna Need It) YAGNI原则核心思想就是:不要做过度设计 不要去设计当前用不到的功能;不要去编写当前用不到的代码;代码可以根据业务留着扩展点,但是无需把还没用到的扩展也…

    What:是什么?

    How:怎么做 ?

    Where:什么时候地方会有坏味道?

    When:应用场景?

    KISS原则

    原则即为让代码尽可能简单,目的是保持代码可读和可维护性 代码少不代表这符合KISS原则,当你使用复杂的正则表达式或lambda等开发技术,短短几行就实现了.。

    What:是什么?

    How:怎么做 ?

    Where:什么时候地方会有坏味道?

    When:应用场景?

    更多相关内容
  • 代码设计说明书 填表日期:6月11日 编码对象名称 读者证编号 代码种类 层次码 代码位数 11 代码结构 效验位 无 编码对象名称 图书信息 代码种类 层次码 代码位数 8 代码结构 效验位 无 编码对象名称 借阅信息 代码...
  • 代码开发平台是无需编码(0代码或无代码)或通过少量代码就可以快速生成应用程序的开发平台。它的强大之处在于,允许终端用户使用易于理解的可视化工具开发自己的应用程序,而不是传统的编写代码方式。构建业务...

    本文目录

    一、低代码开发简介

    二、低代码开发平台优势

    三、主流低代码平台列表以及介绍

    四、参考资料


    一、低代码开发简介

    低代码开发平台是无需编码(0代码或无代码)或通过少量代码就可以快速生成应用程序的开发平台。它的强大之处在于,允许终端用户使用易于理解的可视化工具开发自己的应用程序,而不是传统的编写代码方式。构建业务流程、逻辑和数据模型等所需的功能,必要时还可以添加自己的代码。完成业务逻辑、功能构建后,即可一键交付应用并进行更新,自动跟踪所有更改并处理数据库脚本和部署流程,实现在 IOS,Android,Web 等多个平台上的部署。 [2] 

    低代码开发平台(LCDP)英文全称为Low-Code Development Platform,一个显著的特点是,更多的人可以参与到应用程序开发当中,不仅是具有专业编程能力的程序员,非技术背景的业务人员同样可以构建应用;对于大型企业来讲,低代码开发平台还可以降低IT团队培训、技术部署的初始成本。

    低代码开发平台(LCDP)最早可追溯到20世纪90年代至21世纪初的编程语言和工具,与先前的开发环境类似,早期低代码开发平台基于模型驱动,后期逐渐演进为数据驱动,并创建了自动代码生成和可视化编程的原理。

    2014年,著名的研究机构Forrester正式提出低代码开发概念,并投身对该平台的研究当中。国外有Salesforce(1999年创立)、OutSystems(2001年创立)、Mendix(2005年创立)、Kony(2007年创立)、Scratch(2008年由MIT创立)、国内有iVX(2008年创立)、J2Paas(2017年创立)、起步(2006年创立)、宜搭(2015年创立),YonBuilder(2020年创立) 其中OutSystems在2018年宣布融资3.6亿美金,被视为低代码赛道的独角兽。 [3] 

    2019年底,中国软件行业协会认为,国内低代码领域尚处于早期,市场未来需求将出现暴增。随着低代码应用场景不断拓宽,2020年会有更多企业或企业信息化服务提供商将采用技术门槛更低、开发效率更高的低代码开发平台,为自己量身定做企业核心系统以满足个性化的企业管理需求。

    随着今年疫情的发生,特别是中小型企业生存压力越大越大,相信会有越来越多的企业选择低代码开发平台。

    二、低代码开发平台优势

    (1)上手快:由于低代码或0代码的特征,无疑会大大降低编程语言的学习难度,尤其是0代码(无代码)开发平台,甚至完全不懂程序语言的业务人员都可以快速进行学习和应用开发。

    (2)开发快:由于使用大量的组件和封装的接口进行开发,以及集成云计算的IaaS和PaaS层能力,使得开发效率大幅提升;普遍的观点,低代码能够提升30%以上的开发效率,而0代码(无代码)则能够数倍提升开发效率;并大幅降低开发成本。

    (3)运行快:这是一个相对概念,总体来说,由于低代码开发平台或0代码开发平台使用自动的方式生成(编译成)可执行代码,代码的整体质量优于业界平均水平;并且相对来说,出错(Bug)更加可控,代码的安全性也会更高。

    (4)运维快:一般情况下,低代码开发平台或0代码开发平台,由于采用组件形式,以及面向对象的开发方式,使得代码的结构化程度更高,通常来说更容易维护。

    三、主流低代码平台列表以及介绍

    1、钉钉宜搭(低代码开发平台),阿里云公司旗下产品,于2019年3月上线,流程较简单,阿里生态圈。宜搭是一种面向业务开发者的零代码业务应用搭建平台。开发者可以在可视化界面上以拖拉拽的方式编辑和配置页面,表单和流程,并一键发布到PC和手机端。2020年1月23日-6月30日,疫情期间,阿里巴巴旗下产品宜搭向全社会免费开放,仅供防疫相关用途(包括但不限于疫情统计,健康上报、返工统计等)。

    2、织信Informat(低/零代码开发平台),由深圳基石协作科技有限公司自主研发,公司成立于2019年,团队99人,注册资本2000万,法人郭闫闫,开发是程序语言是Java,简单易上手,界面较友好舒适,关键还免费。

    3、奥哲(低代码开发平台),由深圳奥哲网络科技有限公司自主研发,公司成立于2010年,团队285人,注册资本2000万,法人徐平俊,钉钉参股,深度集成。

    4、思泉云(低代码开发平台),由深圳市思泉软件有限公司研发,公司成立于2004年,团队26人,注册资本500万,法人雷文成,.Net平台,工作流功能强大。

    5、JEPaas(低代码开发平台),由北京凯特伟业科技有限公司研发,公司成立于2008年成立,团队45人,注册资本1000万,公司法人闫建伟,开发是程序语言是Java,有开源版。

    6、炎黄盈动(低代码开发平台),由北京炎黄盈动科技发展有限责任公司研发,公司成立于2003年,团队136人,注册资本2105万,法人刘金柱,文档详细,老板Java大牛。

    7、七巧(低代码开发平台),由广东道一信息技术股份有限公司研发,公司成立于2004年,团队753人,注册资本1519万,法人陈侦,腾讯参股,企业微信集成。

    8、JEECG(低代码开发平台),由北京国炬信息技术有限公司研发,公司成立于2015年,团队8人,注册资金100万,法人张代浩,人气开源软件,功能较简单。

    9、明道云(低/零代码开发平台),由上海万企明道软件有限公司研发,公司成立于2013年,团队38人,注册资金64万,法人任向晖,docker发布,用到程序技术比较多,react、java、C#、nodejs。基于B/S架构,快速搭建工作流+表单的SaaS产品,开放一些API接口,工作流强大,而且是互联网产品直接使用无需下载,从产品角度讲非常出色,适合业务人员使用,同时还支持钉钉、企业微信,桌面系统使用。

    10、简道云(低代码开发平台),由帆软软件有限公司研发,公司成立于2018年成立,团队883人,注册5000万,法人薛爱华,属于是钉钉集成,主营业务BI报表。

    11、ApiConfig(低/零代码开发平台),ApiConfig是一款支持分布式的可视化的的微服务的API配置化开发平台;通过该平台可以无需任何编码的快速发布各种API服务。

    12、IVX(低/零代码开发平台),零代码可视化编程工具,可以快速生成网站、原生APP,并且完全集成了“微信小程序”开发环境。还可以直接生成源代码。带来了编程方式、编程语言的升级。

    13、牛刀(低代码开发平台),牛刀Low-Code低代码开发云,高效全栈开发、跨端App开发,自由发布,灵活部署提供开发、测试、部署、运维的一体化支持,真正低代码、高效率的DevOps开发运维一体化平台。

    14、氚云(低代码开发平台),一款面向管理者或业务人员的在线管理工具,与阿里钉钉深度整合,通过可视化表单、流程设计、智能报表和模板化应用,帮助企业轻松快速构建专属应用。

    15、搭搭云(低代码开发平台),企业前后台打通的的低代码超级应用平台,在一个云端账户内可以定制和使用各种企业应用,并可在线实时调整,即改即用,移动端免开发实时同步。开发者还可以通过代码自由开发。

    16、APICloud(低代码开发平台),领先的移动应用云服务平台,为开发者提供多样化的APP开发工具,如Sublime、Webstorm、Eclipse、Atom、CLI工具等。APICloud专注于手机APP开发、手机APP制作等。

    合理并且有效地运用低代码开发平台,不仅可以让我们工作高效地运行,还能最大程度保证团队目标的达成。目前我们公司使用阿里生态圈的产品比较多,所以低代码开发我们使用的是宜搭平台。目前感觉用着还可以,有问题可以随时询问阿里的技术人员。他们会热心的帮忙解答。

    四、参考资料

    1)低代码开发平台

    2)低代码平台上线 传统“码农”将不复存在

    3)2020中国低代码开发平台十大发展趋势

    完结!

    展开全文
  • 有哪些好用的低代码开发平台?

    千次阅读 2021-03-07 16:38:26
    目前国内主流的低代码开发平台:宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各优劣势,定位也不同,用户可以根据自己需求选择。 一、宜搭 宜...

    目前国内主流的低代码开发平台有:宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势,定位也不同,用户可以根据自己需求选择。

    一、宜搭

    宜搭是阿里巴巴集团在2019年3月公测的面向业务开发者的零代码业务应用搭建平台。开发者可以通过可视化开发单据页面、流程页面、报表页面、展示页面、外部链接页面,将这些页面组合在一起形成轻应用,一键发布到PC和手机端。宜搭在2018年在阿里巴巴集团内部发布,阿里作为首个种子用户,到目前为止已有上万个应用在上面使用。 在2019年9月宜搭也发布了升级版宜搭Plus,在单据、流程、报表等方面都进行了全面升级,成为一款面向ISV开发者的低代码开发平台,能够满足企业复杂业务管理系统开发所需的数据建模、逻辑&服务编排、专业UI页面设计等需求。
    优势:大厂产品,用户体验较好,开发简单应用较为便捷,定位阿里生态,发展较快。
    劣势:只能线上用,不能私有化部署,不交付源代码,价格较高。

    二、简道云

    简道云发布至今快五年了,已经算是市面上发展比较久的产品了,它由国内专业的大数据BI和分析平台厂商——南京帆软软件有限公司(以下简称“帆软”)孵化而来,在数据分析方面具有天然的优势。 简道云与帆软旗下报表、BI等其他产品定位有所不同,简道云致力于帮助非技术人员快速搭建企业应用,无需使用编码,即可搭建销售、OA办公、生产等管理应用,帮助企业规范业务流程、促进团队协作、实现数据追踪!
    简道云的核心功能包括表单、流程表单、仪表盘以及其他一些高级功能,通过这些功能的组合,搭建出各种不同的应用。
    优势:强大数据分析功能、快速移动化、界面交互体验优。
    劣势:缺乏低代码开发功能,模型无法代码化扩展,复杂应用无法支撑;仅支持云端部署,无法私有化部署,费用较高。

    三、明道云

    明道云的发展历史很长,从最开始的梅花网到协作SaaS产品明道,最后在2018年转型成为零代码业务应用构建平台。在行业中,还属于比较新的产品,明道云给自己的定位是一个APaaS平台,让企业用户不需要代码开发就能够搭建出用户体验上佳的销售、运营、人事、采购等核心业务应用。从整体功能上看,明道云对标的是国外应用搭建平台Airtable,主要通过搭建数据管理以及流程管理应用,帮助企业高效管理业务。
    优势:移动化能力强,支持与钉钉和企业微信集成,视图功能较为强大,可扩展性好。
    劣势:报表功能较弱,审批流偏弱,有一定上手门槛,费用高。

    四、云程

    云程平台是一款基于SpringBoot+VUE的低代码开发框架。采用微服务、前后端分离架构,基于可视化流程建模、表单建模、报表建模工具,零代码快速构建云端业务应用 ,平台即可本地化部署,也可基于K8S云原生部署。云程平台也是一款专业的BPM软件,即可独立部署,支撑企业级端到端流程落地,也可嵌入到您的OA、ERP等系统中,作为流程引擎组件使用。云程平台主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量,为企业信息化建设降本增效。
    云程研发团队核心成员有10年以上的软件研发经验,聚焦于低代码平台、流程引擎等中间件产品研发,我们即可输出云程平台源代码,也可提供专业咨询和定制服务。
    官方网站: http://www.yunchengxc.com/
    在线演示:http://www.yunbangong100.com:31110/
    官方文档:http://www.yunchengxc.com/category/help/doc
    优势:云原生架构,流程引擎功能强大,对复杂应用支撑较好,云化和私有化均可,可交付源码,商业模式灵活。
    劣势:缺乏市场宣传,缺乏生态化发展,用户界面美观方面稍有欠缺。

    五、氚云

    氚云是深圳奥哲网络科技有限公司(奥哲网络)三大主推产品之一,跟简道云是同时期的选手,已经发展近5年,是一款面向管理者或业务人员的以场景为中心的零(低)代码平台。2018年成为阿里战略投资的低代码应用搭建工具,与钉钉实现了深度融合。 氚云的定位与以流程为中心的H3 BPM和以业务为中心的云枢不同,氚云是以明确的场景为中心,通过可视化表单、流程设计、智能报表和模板化应用,帮助管理者或业务人员快速搭建流程与应用,透明呈现业务进度,实时展现精准数据,完整沉淀管理信息。
    优势:表单流程配置灵活,应用模板丰富,交互设计体验较好,对钉钉支持较好。
    劣势:功能较基础,复杂功能需使用低代码,需绑定钉钉提供服务,对于非钉钉类应用,局限性较大。

    六、JEPaaS

    JEPaaS是一款优秀的软件平台产品,可视化开发环境,低代码拖拽式配置开发,操作极其简单,可以帮助解决Java项目80%的重复工作,让开发更多关注业务逻辑,大大提高开发效率,能帮助公司大幅节省人力成本和时间成本,同时又不失灵活性。适用于搭建 OA、ERP、CRM、HR、HIS等所有的企业信息管理系统。

    七、伙伴云

    伙伴云,是由有着10年以上论坛软件开发及中小企业服务经验的前Discuz!团队打造的,历经“伙伴云表格”、“伙伴办公”,逐步升级为一个为企业经营服务的数据可视化平台,为企业的全流程运营管理与经营核算提供整体解决方案。通过强大的数据库引擎及权限架构,搭配可灵活定制的流程引擎与大数据分析引擎,配合专家级经营顾问与服务,打造全流程、实时可视化的经营核算体系,为企业构建起上下同心的经营伙伴关系,实现员工持续成长、组织持续变革、业绩持续提高。

    八、道一云

    道一云|七巧Plus(下面简称“七巧Plus”)是道一云旗下的一款低代码开发平台,去年7月左右上线,算是一款比较新的产品了。七巧Plus给自己的定位是一个高生产力的aPaaS平台,帮助企业快速搭建个性化应用,规范流程管理、数据追踪,提高团队协作效率。 道一云从2004年成立至今,近几年已经陆续发布了基于企业微信的协同应用套件——OA、HR、CRM等应用,在应用平台方面还发布了中台、七巧Plus,从布局上来看,是典型的“PaaS+SaaS”发展模式。

    九、JeecgBoot

    JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发!采用前后端分离架构:SpringBoot2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发), 帮助解决Java项目70%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省成本,同时又不失灵活性!JeecgBoot还独创在线开发模式(No代码概念):在线表单配置(表单设计器)、移动配置能力、工作流配置(在线设计流程)、报表配置能力、在线图表配置、插件能力(可插拔)等等!
    JeecgBoot开源版本功能有限,只有系统管理功能,低代码开发和流程引擎均需要购买商业版本。

    十、RuoYi

    RuoYi是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。
    RuoYi开源版本功能有限,只有系统管理功能,流程引擎等高级组件均需要购买商业版本。

    展开全文
  • 几种常见的设计模式(含C++代码

    万次阅读 多人点赞 2018-07-09 13:46:30
    本文部分转载于https://blog.csdn.net/hechao3225/article/details/71366058本文介绍几种常用的设计模式并给出C++实现。1.单例模式作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一...

    本文部分转载于https://blog.csdn.net/hechao3225/article/details/71366058

    本文介绍几种常用的设计模式并给出C++实现。


    1.单例模式

    作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。

    应用:常用于管理资源,如日志、线程池

    实现要点:

    在类中,要构造一个实例,就必须调用类的构造函数,并且为了保证全局只有一个实例,

    需防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为private,

    同时阻止拷贝创建对象时赋值时拷贝对象,因此也将它们声明并权限标记为private;

    另外,需要提供一个全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。

    class Singleton{
    public:
    static Singleton& getInstance(){
    static Singleton instance;
    return instance;
    }
    void printTest(){
    cout<<"do something"<<endl;
    }
    private:
    Singleton(){}//防止外部调用构造创建对象
    Singleton(Singleton const &singleton);//阻止拷贝创建对象
    Singleton& operator=(Singleton const &singleton);//阻止赋值对象
    };
    int main()
    {
    Singleton &a=Singleton::getInstance();
    a.printTest();
    return 0;
    }

    首先,构造函数声明成private的目的是只允许内部调用,getInstance()中的静态局部变量创建时调用,但不允许外部调用构造创建第二个实例;

    然后,拷贝构造和拷贝赋值符是声明成了private而不给出定义,其目的是阻止拷贝,如果企图通过拷贝构造来创建第二个实例,编译器会报错。

    阻止拷贝的另一种写法是声明后接一个"=delete",也能起到相同的作用(C++11)。


    2.工厂模式

    工厂模式包括三种:简单工厂模式、工厂方法模式、抽象工厂模式。

    工厂模式的主要作用是封装对象的创建,分离对象的创建和操作过程,用于批量管理对象的创建过程,便于程序的维护和扩展。

    (1)简单工厂模式

    简单工厂是工厂模式最简单的一种实现,对于不同产品的创建定义一个工厂类,将产品的类型作为参数传入到工厂的创建函数,根据类型分支选择不同的产品构造函数。

    //简单工厂模式
    typedef enum ProductTypeTag
    {
    TypeA,
    TypeB,
    TypeC
    }PRODUCTTYPE;
    class Product//产品抽象基类
    {
    public:
    virtual void Show() = 0;
    };
    class ProductA : public Product
    {
    public:
    void Show()
    {
    cout<<"I'm ProductA"<<endl;
    }
    };
    class ProductB : public Product
    {
    public:
    void Show()
    {
    cout<<"I'm ProductB"<<endl;
    }
    };
    class ProductC : public Product
    {
    public:
    void Show()
    {
    cout<<"I'm ProductC"<<endl;
    }
    };
    class Factory//工厂类
    {
    public:
    Product* CreateProduct(PRODUCTTYPE type)
    {
    switch (type)
    {
    case TypeA:
    return new ProductA();
    case TypeB:
    return new ProductB();
    case TypeC:
    return new ProductC();
    default:
    return NULL;
    }
    }
    };
    int main()
    {
    Factory productCreator;
    Product *productA=productCreator.CreateProduct(TypeA);
    Product *productB=productCreator.CreateProduct(TypeB);
    Product *productC=productCreator.CreateProduct(TypeC);
    productA->Show();
    productB->Show();
    productC->Show();
    if(productA){
    delete productA;
    productA=NULL;
    }
    if(productB){
    delete productB;
    productB=NULL;
    }
    if(productC){
    delete productC;
    productC=NULL;
    }
    return 0;
    }

    (2)工厂方法模式

    其实这才是正宗的工厂模式,简单工厂模式只是一个简单的对创建过程封装。工厂方法模式在简单工厂模式的基础上增加对工厂的基类抽象,不同的产品创建采用不同的工厂创建(从工厂的抽象基类派生),这样创建不同的产品过程就由不同的工厂分工解决:FactoryA专心负责生产ProductA,FactoryB专心负责生产ProductB,FactoryA和FactoryB之间没有关系;如果到了后期,如果需要生产ProductC时,我们则可以创建一个FactoryC工厂类,该类专心负责生产ProductC类产品。

    该模式相对于简单工厂模式的优势在于:便于后期产品种类的扩展。

    //工厂方法模式
    typedef enum ProductTypeTag
    {
    TypeA,
    TypeB,
    TypeC
    }PRODUCTTYPE;
    class Product//产品抽象基类
    {
    public:
    virtual void Show() = 0;
    };
    class ProductA : public Product
    {
    public:
    void Show()
    {
    cout<<"I'm ProductA"<<endl;
    }
    };
    class ProductB : public Product
    {
    public:
    void Show()
    {
    cout<<"I'm ProductB"<<endl;
    }
    };
    class Factory//工厂类
    {
    public:
    virtual Product *createProduct()=0;
    };
    class FactoryA:public Factory{
    public:
    Product *createProduct(){
    return new ProductA();
    }
    };
    class FactoryB:public Factory{
    public:
    Product *createProduct(){
    return new ProductB();
    }
    };
    class FactoryC:public Factory{
    public:
    Product *createProduct(){
    return new ProductC();
    }
    };
    int main()
    {
    Factory *factoryA=new FactoryA();
    Product *productA = factoryA->createProduct();
    productA->Show();
    Factory *factoryB=new FactoryB();
    Product *productB = factoryB->createProduct();
    productB->Show();
    if (factoryA)
    {
    delete factoryA;
    factoryA = NULL;
    }
    if (factoryB)
    {
    delete factoryB;
    factoryB = NULL;
    }
    if (productA)
    {
    delete productA;
    productA = NULL;
    }
    if (productB)
    {
    delete productB;
    productB = NULL;
    }
    return 0;
    }

    (3)抽象工厂模式

    抽象工厂模式对工厂方法模式进行了更加一般化的描述。工厂方法模式适用于产品种类结构单一的场合,为一类产品提供创建的接口;而抽象工厂方法适用于产品种类结构多的场合,就是当具有多个抽象产品类型时,抽象工厂便可以派上用场。

    抽象工厂模式更适合实际情况,受生产线所限,让低端工厂生产不同种类的低端产品,高端工厂生产不同种类的高端产品。

    //抽象工厂模式
    class ProductA
    {
    public:
    virtual void Show() = 0;
    };
    class ProductA1 : public ProductA//A类低端产品
    {
    public:
    void Show()
    {
    cout<<"I'm ProductA1"<<endl;
    }
    };
    class ProductA2 : public ProductA//A类高端产品
    {
    public:
    void Show()
    {
    cout<<"I'm ProductA2"<<endl;
    }
    };
    class ProductB
    {
    public:
    virtual void Show() = 0;
    };
    class ProductB1 : public ProductB//B类低端产品
    {
    public:
    void Show()
    {
    cout<<"I'm ProductB1"<<endl;
    }
    };
    class ProductB2 : public ProductB//B类高端产品
    {
    public:
    void Show()
    {
    cout<<"I'm ProductB2"<<endl;
    }
    };
    class Factory
    {
    public:
    virtual ProductA *CreateProductA() = 0;
    virtual ProductB *CreateProductB() = 0;
    };
    class Factory1 : public Factory//1号工厂用于生产低端产品
    {
    public:
    ProductA *CreateProductA()
    {
    return new ProductA1();
    }
    ProductB *CreateProductB()
    {
    return new ProductB1();
    }
    };
    class Factory2 : public Factory//2号工厂用于生产高端产品
    {
    ProductA *CreateProductA()
    {
    return new ProductA2();
    }
    ProductB *CreateProductB()
    {
    return new ProductB2();
    }
    };
    int main()
    {
    Factory *factory1 = new Factory1();
    ProductA *productA1 = factory1->CreateProductA();
    ProductB *productB1 = factory1->CreateProductB();
    productA1->Show();
    productB1->Show();
    Factory *factory2 = new Factory2();
    ProductA *productA2 = factory2->CreateProductA();
    ProductB *productB2 = factory2->CreateProductB();
    productA2->Show();
    productB2->Show();
    if (factory1)
    {
    delete factory1;
    factory1 = NULL;
    }
    if (productA1)
    {
    delete productA1;
    productA1= NULL;
    }
    if (productB1)
    {
    delete productB1;
    productB1 = NULL;
    }
    if (factory2)
    {
    delete factory2;
    factory2 = NULL;
    }
    if (productA2)
    {
    delete productA2;
    productA2 = NULL;
    }
    if (productB2)
    {
    delete productB2;
    productB2 = NULL;
    }
    }

    3 策略模式

    转载于https://blog.csdn.net/lh844386434/article/details/16825861

    策略模式也是一种非常常用的设计模式,而且也不复杂。下面我们就来看看这种模式。

    定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    角色:
        抽象策略角色(Strategy): 抽象策略类。
        具体策略角色(ConcreteStrategy):封装了继续相关的算法和行为。
        环境角色(Context):持有一个策略类的引用,最终给客户端调用。

    UML图:

                    

    事例: (该事例改编自一道网络设计模式面试题)

         如现在你是一个设计师,你正在设计一种空调。但是你们的空调要支持3种模式。冷风模式(ColdWind), 热风模式(WramWind),无风模式(NoWind)。
    当选择ColdWind模式,将输送冷风;当选择WarmWind模式,将输送热风;在选择NoWind模式时,空调什么都不做。你将考虑如何为空调设计应用程序?如果将来空调需要增加支持新的模式呢?

    这道面试题,其实可以用各种模式实现,然而在这里我理解策略模式比较合适。我们将冷风模式,和热风模式以及无风模式可以理解为各种不同的算法。显然策略模式非常符合。

    这里ColdWind, WramWind, NoWind 其实就是ConcreteStrategy。 IWnd 是抽象策略类。 所以我们开始这么封装我们策略类

    #include <iostream>
    using namespace std;
    #define  free_ptr(p) \
    	if(p) delete p; p = NULL;
     
    class IWind{
    public:
    	virtual ~IWind(){};
    	virtual void blowWind() = 0;
    };
     
    class ColdWind : public IWind{
    public:
    	void blowWind(){
    		cout<<"Blowing cold wind!"<<endl;
    	};
    };
     
    class WarmWind : public IWind{
    public:
    	void blowWind(){
    		cout<<"Blowing warm wind!"<<endl;
    	}
    };
     
    class NoWind : public IWind{
    public:
    	void blowWind(){
    		cout<<"No Wind!"<<endl;
    	}
    };
    

    然后我们实现一个windmode 的类,作为 wind 系列的环境类:

    class WindMode{
    public:
    	WindMode(IWind* wind): m_wind(wind){};
    	~WindMode(){free_ptr(m_wind);}
    	void blowWind(){
    		m_wind->blowWind();
    	};
    private:
    	IWind* m_wind;
    };

    最后客户端代码:

    int main(int argc, char* argv[])
    {
    	WindMode* warmWind = new WindMode(new WarmWind());
    	WindMode* coldWind = new WindMode(new ColdWind());
    	WindMode* noWind = new WindMode(new NoWind());
     
    	warmWind->BlowWind();
    	coldWind->BlowWind();
    	noWind->BlowWind();
     
    	free_ptr(warmWind);
    	free_ptr(coldWind);
    	free_ptr(noWind);
    	system("pause");
    	return 0;
    }
    (这个实例网上也有人用命令模式实现。命令模式请看我后面的博客。把冷风,热风,无风作为一种命令。当然这是另外一种思路,也未尝不可。但是我觉得如果采用命令模式。类的个数会相应增加(增加系列的命令类),造成额外的开销。当添加一个新模式的时候,你需要添加的类过多。或多或少不是那么明智。所以我个人认为在这里策略模式更好一些。)

    总的说来策略模式:

    优点:
    1、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护。
    2、 策略模式让你可以动态的改变对象的行为,动态修改策略

    缺点:
    1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    2、类过多---策略模式造成很多的策略类,每个具体策略类都会产生一个新类。(这点可以通过享元模式来克服类过多)

    模式定义:

            命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

            命令对象将动作和接受者包进对象中,这个对象只暴露一个execute()方法。

            当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。

    模式结构:

    举例:

            遥控器上有一个插槽,可以放上不同的装置,然后用按钮控制。我们这里放置电灯,并有开和关按钮。可以命令模式实现。

    UML设计:


            其中,RemoteControl为遥控器,LightOnCommand为开灯请求对象,LightOffCommand为关灯请求对象,他们继承自基类Command,这样设计可以使插槽在以后防止其他的装置。

    #include <iostream>
     
    using namespace std;
     
    //电灯类
    class Light
    {
    public:
    	void on()
    	{
    		cout << "Light on !" << endl;
    	}
     
    	void off()
    	{
    		cout << "Light off !" << endl;
    	}
    };
    //命令类
    class Command
    {
    public:
    	virtual void execute(){}
    };
    //具体命令类
    class LigthOnCommand : public Command
    {
    public:
    	LigthOnCommand(Light* lig):light(lig){}
    	//execute方法
    	void execute()
    	{
    		light->on();
    	}
    private:
    	Light* light;
    };
     
    class LigthOffCommand : public Command
    {
    public:
    	LigthOffCommand(Light* lig):light(lig){}
    	void execute()
    	{
    		light->off();
    	}
    private:
    	Light* light;
    };
     
    //遥控器类
    class RemoteControl
    {
    public:
    	void setCommand(Command* command)
    	{
    		slot = command;
    	}
    	void buttonOn()
    	{
    		slot->execute();
    	}
    private:
    	Command* slot;
    };
    //客户代码
    int main()
    {
    	RemoteControl lightOnControl;
    	RemoteControl lightOffControl;
     
    	Command* onCommand = new LigthOnCommand(new Light());
    	Command* offCommand = new LigthOffCommand(new Light());
     
    	lightOnControl.setCommand(onCommand);
    	lightOffControl.setCommand(offCommand);
     
    	lightOnControl.buttonOn();
    	lightOffControl.buttonOn();
     
    	return 0;
    }
    

    执行结果:

    Lighton !

    Lightoff !

    请按任意键继续. . .


    展开全文
  • 对JAVA代码设计六大原则的理解

    千次阅读 2017-10-13 23:54:16
    对JAVA代码设计六大原则的理解记得一次去面试的时候,面试官问了我好个问题,很尴尬,好个都没能流利得回答上来。对其中一个问题比较深刻,他当时是这样问我的:说下代码优化的6大原则,我当时一听,在脑子...
  • 二、常用的设计模式有哪些? 1、单例模式(懒汉式、饿汉式) 步骤: 1、构造方法私有化,让除了自己类能创建,其他类都不能创建。 2、在自己的类中创建一个单实例(懒汉模式是在需要的时候才创建,饿汉模式是一开始...
  • 对于设计模式,相信大多数人都了解,或为了面试,或为了实际开发,但是对于大多数人来说,实际开发中,真正用设计模式的地方,少之又少。最主要的原因,还是因为我们对设计模式并未真正的理解。那么,如何理解设计...
  • 算法的描述方法几种

    万次阅读 2021-07-29 02:05:32
    答案一、流程图流程图是描述代码的一很好的工具,利用流程图,可以很好的表现出秩序执行过程中的三基本结构组成—顺序结构、选择结构、循环结构等。需要注意的是,在使用流程图时,规定需要使用一些基本图形。...
  • JAVA代码重构–改善既有代码设计(一) 本文主要借鉴了&lt;重构 改善既有代码设计&gt;与&lt;设计模式&gt;这两本书; 主要解释重构的原理(principles)和最佳实践方式(best practices),并指出...
  • 领域驱动设计DDD是一种设计思想,它可以同时指导中台业务建模和微服务设计(中台本质是业务模型,微服务是业务模型的系统落地),领域驱动设计强调领域模型和微服务设计的一体性,先领域模型然后才微服务,而不是...
  • QT纯代码设计UI界面&Demo

    千次阅读 2020-05-18 17:39:59
    UI的设计方法有几种: ①一种是使用Qt Designer,也就是可视化设计,这在小型项目中常见,优点就是可观简便; ②另一种就是纯代码设计UI,也就是不可视设计UI,这在中大型项目常见,优点是界面隐蔽性强。 无论...
  • 但是却没有在课后好好的自己去主动敲代码,笔者不能让你多主动去自己实践,但是笔者可以给你介绍款更好的写代码的软件(手机电脑都可以)。C语言作为一门起源比较早的编程语言,可以编程的手...
  • 第一章-宝箱抽奖模块与代码设计(一)

    万次阅读 多人点赞 2016-08-24 14:53:31
    宝箱抽奖模块与代码设计(一)宝箱抽奖模块与代码设计一 无聊的开场白 每篇文章的背后都个高大上的故事 怎样的代码才算是好的代码 简单的需求 简单的代码Java实现 一些基本的类 玩家类 抽奖服务类 先大致确定抽奖...
  • java常见的设计模式及其代码实现

    千次阅读 2018-11-26 17:16:03
    常见的设计模式 单例设计模式 该设计模式要求在程序运行中,同一对象只能在JVM中存在一个实例。 其实这一点很简单实现,只要我们创建类的时候,将构造方法私有,外界无法创建对象。(不保证特殊情况下破坏单例的...
  • 常见的数据库几种

    万次阅读 2020-06-01 10:58:29
    SQL(StructuredQueryLanguage,结构化查询语言)是一数据库查询语言和程序设计语言,主要用于管理数据库中的数据,如存取数据、查询数据、更新数据等。 SQL是IBM公司于1975—1979年之间开发出来的,在20世纪随着...
  • 随着低代码平台的日益成熟,模板越来越丰富、生态越来越完善,未来低代码的适用范围也会得到扩展,必将在某些领域绽放光彩!
  • 代码审查的四方式

    万次阅读 2019-05-07 10:33:16
    没有人能保证他产出的代码一定是完美的。下文阐述了4种主流的代码审查(code review)类型,相信作为专业的开发人员,你应该都了解它们!...我将在本文列出几种代码的审查的类型,并详细解释它们各自是如何工作的。...
  • Java常见设计模式总结

    万次阅读 多人点赞 2021-09-18 17:18:54
    设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块...
  • C语言基本上是大学计算机及其相关专业在大一上学期就会开的一门...但是却没有在课后好好的自己去主动敲代码,笔者不能让你多主动去自己实践,但是笔者可以给你介绍款更好的写代码的软件(手机电脑都可以)。 ...
  • 《重构 改善既有代码设计 1》重构原则

    千次阅读 热门讨论 2020-12-20 15:39:01
    重构 既有代码设计,一本经典神书,两年前入手,一年前看了一半,感觉一般般,今天起,再次拜读,希望会不一样的收获! /** * @startTime 2020-12-16 23:22 * @endTime 2020-12-16 23:59 * @startPage 1 * ...
  • [Java多线程 五]---JAVA锁有哪些种类

    万次阅读 多人点赞 2017-09-02 12:09:25
    转载自: ...上一篇既然提到了锁,这一篇来详细介绍JAVA中的锁,也为之后JUC下的锁做一个铺垫 ... 自旋锁 ,自旋锁的其他种类,阻塞锁,可重入锁 ,读写锁 ,互斥锁 ,悲观锁 ,乐观锁 ,公平锁 ,偏向锁, 对象锁,线程
  • HTML期末设计——代码

    万次阅读 多人点赞 2020-06-22 23:55:24
    这个网页设计也就是用了我学到的知识做的一个中规中矩的网页,可以给以后的大一新生们做个参考,和商业网站的效果肯定是没得比的,期望太高的可以关掉了,要严词批评我的请不要在我这说,当然,温柔的话,可以 ...
  • 在前端架构设计这块也已经工作了一段时间,也翻遍了很多书籍,但是就目前来说笔者还是没有看过真正把前端架构讲好的书,加上现在前端技术的发展诞生了许多新的框架,如:vue、react、angular,这也越来越淡化了前端...
  • 领域驱动设计DDD是一种设计思想,它可以同时指导中台业务建模和微服务设计(中台本质是业务模型,微服务是业务模型的系统落地),领域驱动设计强调领域模型和微服务设计的一体性,先领域模型然后才微服务,而不是...
  • 代码分类

    千次阅读 2019-08-17 12:17:03
    最近对写代码的思路和逻辑一些思考,觉得代码需要分类来编写,现在觉得大致可分四类, 第一类是技术功能代码,这种代码与业务,与要实现的系统完全没有依赖,各个编程语言标准库,框架都属于此类,这类代码尽量按...
  • 详细设计的伪代码的实例

    万次阅读 2018-01-18 10:48:16
    代码(Pseudocode)是一算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 ...
  • 推荐几种好用的网页设计工具

    千次阅读 2019-03-07 16:07:25
    今天我就要给大家推荐几种好用的网页设计工具,了这些工具可以帮助设计师更加轻松地完成工作。 网站伴随着网络的快速发展而快速兴起,成为了上网的主要依托,而网页设计也因此成为了众多设计师的宠儿。今天我...
  • 简介:在日常的开发和设计过程中,大家对技术设计上的一些问题往往会面临很多的选择,不同的人会不同的选择。本文介绍的就是我在工作中遇到的一些问题而总结和使用到的一些常用原则。 不管我一生中取得了...
  • Qt设计用户界面的三方法

    千次阅读 2019-05-24 21:41:04
    Qt设计界面方式: (1)手工编写创建界面的代码:此方法比较复杂,不够直观; (2) 使用Qt Designer界面编辑器设计:可直接拖放控件、设置控件的属性,简单、直观、易于操作; (3)动态加载UI文件并生成界面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,289,664
精华内容 515,865
关键字:

代码设计有哪些种类