当前位置: 首页 > news >正文

网站的建设费计入什么科目网站开发文献综述

网站的建设费计入什么科目,网站开发文献综述,短网址 wordpress,网站手机端做app开发设计模式精讲#xff1a;掌握工厂方法与抽象工厂的精髓 一、引言#xff1a;如何学习设计模式#xff1f;二、工厂方法#xff08;也叫工厂模式#xff09;2.1、代码结构2.2、符合的设计原则2.3、小结 三、抽象工厂3.1、代码结构3.2、符合的设计原则3.3、小结 总结 一、引… 设计模式精讲掌握工厂方法与抽象工厂的精髓 一、引言如何学习设计模式二、工厂方法也叫工厂模式2.1、代码结构2.2、符合的设计原则2.3、小结 三、抽象工厂3.1、代码结构3.2、符合的设计原则3.3、小结 总结 一、引言如何学习设计模式 学习设计模式最主要要抓住一点就是怎么分析这个稳定点和变化点。自己实现一个框架或者是实现一个具体的小功能本质上分析问题的思路都是一样的首先要去把稳定点给它抽象出来然后针对这个变化点想着怎么去扩展它。所以这里还是要反复的介绍怎么分析这个稳定点和变化点具体不同的设计模式是怎么来处理这个扩展就是扩展的问题稳定点它是怎么处理的用C的语言特性是怎么去解决这些问题的沿着这个思路去学习。 前面已经介绍了设计模式当中的模板方法、观察的模式、以及策略模式这里再次强调以下学习、掌握设计模式的学习步骤。 首先需要来了解设计模式解决了什么问题。本质上是分析它的稳定点和变化点实际在做具体功能开发的时候也需要去抽象具体的稳定点以及想办法去扩展变化点这样在实际开发过程当中尽量写少量的代码去应对未来需求的变化。第二点设计模式的代码结构是什么。需要培养一个看代码、看一些框架或者看项目代码结构的时候马上能够反应出来使用了什么设计模式或者它符合什么设计原则从而可以推断出代码具体的意图。熟悉实现具体设计模式的代码结构能够帮助我们对一个代码有一个敏感度以便能够快速的进行推断和反应。第三点看这些设计模式符合了哪些设计原则。因为设计模式是由设计原则推导过来的所以可以按照这一个设计模式的产生的流程重新去思考这一个问题能够帮助我们去很好的去设计我们的代码。相信很多人在具体的工作当中都有自己不同的一些设计方式它不一定符合某一些设计模式未来大家应对的某些需求也会自己去设计一个框架所以可以思考它符合哪些设计原则。第四点如何在上面扩展代码。尤其是对于初学者或刚刚参加工作的朋友们对这个扩展代码一定要非常的清楚就是如果在这个设计模式的基础上要修改哪些代码这个是必须要掌握的。第五点按照自己的需求或者自己的项目以及自己的工作场景进行一个联系哪些需求变化可以使用设计模式在看开源框架的时候也可以去看一下它是怎么解决这一个问题的。记住几个关键设计模式的一些典型应用场景能够帮助我们快速的反应当具体需求来了知道该怎么使用某一些设计模式。 #mermaid-svg-n8gtI5I9yDKs5OtJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .error-icon{fill:#552222;}#mermaid-svg-n8gtI5I9yDKs5OtJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n8gtI5I9yDKs5OtJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .marker.cross{stroke:#333333;}#mermaid-svg-n8gtI5I9yDKs5OtJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .cluster-label text{fill:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .cluster-label span{color:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .label text,#mermaid-svg-n8gtI5I9yDKs5OtJ span{fill:#333;color:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .node rect,#mermaid-svg-n8gtI5I9yDKs5OtJ .node circle,#mermaid-svg-n8gtI5I9yDKs5OtJ .node ellipse,#mermaid-svg-n8gtI5I9yDKs5OtJ .node polygon,#mermaid-svg-n8gtI5I9yDKs5OtJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .node .label{text-align:center;}#mermaid-svg-n8gtI5I9yDKs5OtJ .node.clickable{cursor:pointer;}#mermaid-svg-n8gtI5I9yDKs5OtJ .arrowheadPath{fill:#333333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-n8gtI5I9yDKs5OtJ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-n8gtI5I9yDKs5OtJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-n8gtI5I9yDKs5OtJ .cluster text{fill:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ .cluster span{color:#333;}#mermaid-svg-n8gtI5I9yDKs5OtJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-n8gtI5I9yDKs5OtJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 学习步骤 设计模式解决什么问题 稳定点 变化点 设计模式的代码结构是什么 设计模式符合哪些设计原则 如何在上面扩展代码 该设计模式有哪些典型应用场景 联系工作场景 开源框架 这个就是设计模式具体的学习步骤。 二、工厂方法也叫工厂模式 首先从定义出发工厂方法的定义定义一个用于创建对象的接口让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。 接下来就要分析它解决了什么问题。它的定义不需要特别的去关注也不要记这个定义主要分析这个定义当中的稳定点和变化点。 稳定点创建同类对象的接口并且同类对象有一个相同的职责。要提供同类对象的一个接口同类对象只有一个相同的职责职责就是功能的意思。变化点对象的拓展。同一类对象会越来越多要进行对象的扩展。 2.1、代码结构 举个例子来帮助理解 实现一个导出数据的接口让客户选择数据的导出方式。 这个的职责是导出数据这里面的导出数据有很多方式可以让用户选择即同类对象都有导出功能而且都是导出数据。因此要创建一个对象接口以满足同类对象有相同的职责职责就是导出数据。 不使用设计模式的时候首先要使用设计原则注意到的是“导出数据”是一个职责马上要想到接口对于这种问题想都不用想就是要考虑用接口去封装它因为有多个不同导出数据的接口就要用统一的接口这个接口就代表它有一个什么样的功能即导出功能马上就可以写出这样的一个语句 // 实现导出数据的接口, 导出数据的格式包含 xmljson文本格式txt 后面可能扩展excel格式csv class IExport { public:virtual bool Export(const std::string data) 0;virtual ~IExport(){} };就是导出这个具体的数据有很多格式比如说有xml有json有txt还有excel格式csv等等。然后尝试实现接口继承IExport 实现Export()方法。 #include string // 实现导出数据的接口, 导出数据的格式包含 xmljson文本格式txt 后面可能扩展excel格式csv class IExport { public:virtual bool Export(const std::string data) 0;virtual ~IExport(){} };class ExportXml : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportJson : public IExport { public:virtual bool Export(const std::string data) {return true;} }; // csv class ExportTxt : public IExport { public:virtual bool Export(const std::string data) {return true;} };// class ExportCSV : public IExport { // public: // virtual bool Export(const std::string data) { // return true; // } // };// 1 int main() {std::string choose/* */;if (choose txt) {/***/IExport *e new ExportTxt();/***/e-Export(hello world);} else if (choose json) {/***/IExport *e new ExportJson();/***/e-Export(hello world);} else if (choose xml) {IExport *e new ExportXml();e-Export(hello world);} else if (choose csv) {IExport *e new ExportXml();e-Export(hello world);} }实现导出功能实现IExport类就可以导出为xml、json、txt等格式因为在这里只有一个导出职责导出功能都是一样的同样的接口Export把它实现好未来可能会增加CSV也可以实现一下。接下来让用户选择数据的导出方式int main() 就要实现这个功能了。在这里按用户的输入判断然后new出来这个数据然后再把它进行Export。这个是没有使用设计模式的时候仅仅考虑面向接口编程写出来的这样的一个代码。 接下来看一下符合设计模式是怎么进行开发的其实这里创建同类对象的接口可以用一个工厂接口来实现有相同的职责可以用一个具体的职责接口来实现也就是说这里应该要抽象出两个接口一个是对象产生的接口一个是具体的职责的接口。要理解这句话先思考一个问题 为什么要有工厂模式 再来了解一下为什么在这里面要用两个接口而不直接new对象来使用刚刚举的例子有一个业务可能没注意到主要的原因是没有表现出来因为通常如果使用模式的时候new的对象不是直接用一个对象这么简单new完之后还要去有复杂的构造流程。 设计模式通常是要解决创建过程比较复杂而且希望对外隐藏这些细节的场景也就是说某一个用户只使用需要使用的功能。比如说导出JSON数据除了要去把JSON库导出来(加载JSON库可能还需要去调用一些配置参数配置这个JSON的参数还可能要进行初始化一些数据把这些流程都封装起来放到某一个对象的JSON导出的接口中那么对于用户而言只需要知道用JSON导出用户根本不需要关注还要加载一个库、配置一些参数、初始化一些值才能够去使用它的导出功能。 当创建过程比较复杂而用户只需要关注他的职责并不关注他的创建过程比较复杂的这个流程用户不需要知道这种时候需要使用工厂方法模式。举个例子比如说连接池、线程池等使用连接池通常只需要把一个任务push进去就行了对于用户而言只需要有一个push的操作就行了往里面去push后会自动帮用户完成如果真正把线程池封装的好那么对于用户而言应该只需要知道有一个push接口就行了。都知道线程池要去构建它要初始化这个把线程加载进来把线程初始化好把一些数据初始化然后把一些入口函数初始化等等这里面有复杂的构造流程这些构造流程对于用户而言没什么用用户根本不需要关注这些东西用户只需要push任务对于一个正确的封装者做功能开发、做功能抽象的人应该是让用户知道的越少越好。 要点解决创建过程比较复杂希望对外隐藏这些细节的场景。 比如连接池、线程池隐藏对象真实类型对象创建会有很多参数来决定如何创建创建对象有复杂的依赖关系。 工厂方法实现的代码 #include string // 实现导出数据的接口, 导出数据的格式包含 xmljson文本格式txt 后面可能扩展excel格式csv class IExport { public:virtual bool Export(const std::string data) 0;virtual ~IExport(){} };class ExportXml : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportJson : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportTxt : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportCSV : public IExport { public:virtual bool Export(const std::string data) {return true;} };class IExportFactory { public:IExportFactory() {_export nullptr;}virtual ~IExportFactory() {if (_export) {delete _export;_export nullptr;}}bool Export(const std::string data) {if (_export nullptr) {_export NewExport();}return _export-Export(data);} protected:virtual IExport * NewExport(/* ... */) 0; private:IExport* _export; };class ExportXmlFactory : public IExportFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportXml();// 可能之后有什么操作return temp;} }; class ExportJsonFactory : public IExportFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportJson;// 可能之后有什么操作return temp;} }; class ExportTxtFactory : public IExportFactory { protected:IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportTxt;// 可能之后有什么操作return temp;} };class ExportCSVFactory : public IExportFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportCSV;// 可能之后有什么操作return temp;} };int main () {IExportFactory *factory new ExportCSVFactory();factory-Export(hello world);return 0; }为了实现封装出复杂的对象的构建过程给了一个对象创建的一个接口IExportFactory 那么这里的IExport 是功能接口具体到底实现了一个什么功能。具体的构造流程在NewExport()中实现用户不会关注这个的实现用户只关注Export功能导出功能。知道这些接口之后还需要不同对象的构造IExportFactory 是基类使用ExportTxtFactory 、ExportCSVFactory 、ExportXmlFactory 等实现不同的导出对象复杂的操作流程就在NewExport中实现。最后就是在main ()中使用它。 代码结构 对象创建接口。功能接口。对象扩展。多态调用的使用方式。 2.2、符合的设计原则 1最小知道原则。 2面向接口原则。 用户知道的越少越好让用户只需要知道最需要的东西就行想让用户知道的越少就要面向接口编程把用户只关注的行为抽象成接口。 需要哪些接口 具体的职责类的功能接口。简单来说就是提供了一个什么功能给用户示例中用户只需要有一个导出的功能只要给用户这样一个导出接口用户只关注一个导出接口就行了即功能接口是做什么事情的用户要知道。对象创建接口。虽然用户不关注但是要知道怎么去创建就是有一个具体的对象到底用户应该用什么东西来实现这个功能比如说是用JSON来实现这个导出功能、用txt来实现这个导出功能、用CSV来现这个导出功能就需要一个对象创建的接口这个对象创建的接口就是所说的工厂接口。 2.3、小结 稳定点都是用抽象去解决抽象那些万成不变的东西具体可以用接口来实现。通过分析稳定点发现要有一个创建同类对象的一个职责接口以及一个功能接口这两个东西是稳定点需要注意这个功能接口对于用户而言是不可见的用户不需要关注这一个功能接口这个功能接口它具体起到一个什么作用可以看到示例中IExportFactory的功能对象创建的流程。IExportFactory只提供了Export并没有提供创建的流程创建流程在NewExport()实现。 扩展代码 实现对象创建接口。实现功能接口。多态调用。 本质延迟到子类来选择实现。 结构图 #mermaid-svg-S0iJkUH06G9lDruS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-S0iJkUH06G9lDruS .error-icon{fill:#552222;}#mermaid-svg-S0iJkUH06G9lDruS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S0iJkUH06G9lDruS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-S0iJkUH06G9lDruS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S0iJkUH06G9lDruS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S0iJkUH06G9lDruS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S0iJkUH06G9lDruS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S0iJkUH06G9lDruS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S0iJkUH06G9lDruS .marker.cross{stroke:#333333;}#mermaid-svg-S0iJkUH06G9lDruS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S0iJkUH06G9lDruS g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-S0iJkUH06G9lDruS g.classGroup text .title{font-weight:bolder;}#mermaid-svg-S0iJkUH06G9lDruS .nodeLabel,#mermaid-svg-S0iJkUH06G9lDruS .edgeLabel{color:#131300;}#mermaid-svg-S0iJkUH06G9lDruS .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-S0iJkUH06G9lDruS .label text{fill:#131300;}#mermaid-svg-S0iJkUH06G9lDruS .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-S0iJkUH06G9lDruS .classTitle{font-weight:bolder;}#mermaid-svg-S0iJkUH06G9lDruS .node rect,#mermaid-svg-S0iJkUH06G9lDruS .node circle,#mermaid-svg-S0iJkUH06G9lDruS .node ellipse,#mermaid-svg-S0iJkUH06G9lDruS .node polygon,#mermaid-svg-S0iJkUH06G9lDruS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S0iJkUH06G9lDruS .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-S0iJkUH06G9lDruS g.clickable{cursor:pointer;}#mermaid-svg-S0iJkUH06G9lDruS g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-S0iJkUH06G9lDruS g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-S0iJkUH06G9lDruS .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-S0iJkUH06G9lDruS .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-S0iJkUH06G9lDruS .dashed-line{stroke-dasharray:3;}#mermaid-svg-S0iJkUH06G9lDruS #compositionStart,#mermaid-svg-S0iJkUH06G9lDruS .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #compositionEnd,#mermaid-svg-S0iJkUH06G9lDruS .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #dependencyStart,#mermaid-svg-S0iJkUH06G9lDruS .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #dependencyStart,#mermaid-svg-S0iJkUH06G9lDruS .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #extensionStart,#mermaid-svg-S0iJkUH06G9lDruS .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #extensionEnd,#mermaid-svg-S0iJkUH06G9lDruS .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #aggregationStart,#mermaid-svg-S0iJkUH06G9lDruS .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS #aggregationEnd,#mermaid-svg-S0iJkUH06G9lDruS .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-S0iJkUH06G9lDruS .edgeTerminals{font-size:11px;}#mermaid-svg-S0iJkUH06G9lDruS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Factory CreateProduct() Product Operator() ConcreteProduct1 Operator() ConcreteProduct2 Operator() ConcreteProduct3 Operator() 思维导图 三、抽象工厂 理解了工厂模式抽象工厂就非常的简单它其实就是在工厂模式当中增加了一个多职责它除了创建同类对象的接口它还有就是有多个相同的职责。 抽象工厂的定义提供一个接口让该接口负责创建一系列“相关或者相互依赖的对象”无需指定它们具体的类。 解决了什么问题 稳定点创建同类对象的接口并且同类对象有多个相同的职责。和工厂方法模式唯一的区别是有多个相同的职责。变化点对象的拓展。和工厂方法模式一样 3.1、代码结构 看一个例子 实现一个拥有导出导入数据的接口让客户选择数据的导出导入方式。 跟前面的工厂方法中的例子差不多只是多了一个导入的功能并且让用户去选择导入的方式。也就是说某一个对象比如说CSV)它刚刚只需要有一个导出功能现在还要有一个导入的功能同样的要把这个导入功能职责也要抽象成一个接口。 这个抽象工厂就非常的简单它的代码结构基本和工厂方法一样的 对象创建接口。包括创建具体对象提供多个功能接口来调用。在创建对象接口当中去调用功能接口。多个功能接口。 抽象工厂在工厂方法上面就多了一个它是有多个职责的它有多个功能的。 抽象工厂的代码实现 #include string // 实现导出数据的接口, 导出数据的格式包含 xmljson文本格式txt 后面可能扩展excel格式csv class IExport { public:virtual bool Export(const std::string data) 0;virtual ~IExport(){} };class ExportXml : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportJson : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportTxt : public IExport { public:virtual bool Export(const std::string data) {return true;} };class ExportCSV : public IExport { public:virtual bool Export(const std::string data) {return true;} };class IImport { public:virtual bool Import(const std::string data) 0;virtual ~IImport(){} };class ImportXml : public IImport { public:virtual bool Import(const std::string data) {return true;} };class ImportJson : public IImport { public:virtual bool Import(const std::string data) {return true;} };class ImportTxt : public IImport { public:virtual bool Import(const std::string data) {return true;} };class ImportCSV : public IImport { public:virtual bool Import(const std::string data) {// ....return true;} };class IDataApiFactory { public:IDataApiFactory() {_export nullptr;_import nullptr;}virtual ~IDataApiFactory() {if (_export) {delete _export;_export nullptr;}if (_import) {delete _import;_import nullptr;}}bool Export(const std::string data) {if (_export nullptr) {_export NewExport();}return _export-Export(data);}bool Import(const std::string data) {if (_import nullptr) {_import NewImport();}return _import-Import(data);} protected:virtual IExport * NewExport(/* ... */) 0;virtual IImport * NewImport(/* ... */) 0; private:IExport *_export;IImport *_import; };class XmlApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportXml;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作或者许多参数IImport * temp new ImportXml;// 可能之后有什么操作return temp;} };class JsonApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportJson;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作或者许多参数IImport * temp new ImportJson;// 可能之后有什么操作return temp;} }; class TxtApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportTxt;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作或者许多参数IImport * temp new ImportTxt;// 可能之后有什么操作return temp;} };class CSVApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作或者许多参数IExport * temp new ExportCSV;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作或者许多参数IImport * temp new ImportCSV;// 可能之后有什么操作return temp;} };// 相关性 依赖性 工作当中 int main () {IDataApiFactory *factory new CSVApiFactory();factory-Import(hello world);factory-Export(hello world);return 0; }除了导出接口还加入了导入接口分别实现它们的职责。 3.2、符合的设计原则 基本和工厂方法的一样。 1最小知道原则。 2面向接口原则。 3.3、小结 抽象工厂模式和工厂方法的区别工厂方法通常一个对象只有一个职责而抽象工厂模式是一个对象有多个职责。 结构图 思维导图 总结 在本文中我们深入探讨了设计模式中两个重要的概念工厂方法和抽象工厂。首先介绍了设计模式的重要性和应用场景然后重点讲解了工厂方法模式和抽象工厂模式的原理和实现方式。通过详细的代码结构和实例分析我们揭示了它们如何提供灵活性、可扩展性和可维护性并如何符合设计原则。最后我们强调了工厂方法和抽象工厂的精髓帮助读者深入理解并将其应用于实际项目中从而提高编程技能和代码质量。
http://www.sadfv.cn/news/292629/

相关文章:

  • 秦皇岛网站制作定制如何进行网站调试
  • 怎样推广公司的网站双陈记 wordpress
  • flash做网站步骤衡水建网站的公司
  • 新建定制网站费用电商名字创意名称
  • 网站模板案例做网站属于什么工作
  • 咸阳公司网站建设网站服务器错误403
  • 专门做酒店自助餐的网站摄影设计素材
  • 学做网站论坛会员账号网站开发中 整体框架的架构
  • 软件开发岗位要求整站seo优化哪家好
  • 山东住房和城乡建设部网站禁用wordpress自动保存的插件
  • 深圳网站建设案做网站的地方
  • 网站建设建站流程方案百度关键词推广2元一天
  • 建设工程职称论文查询网站番禺附近网站建设推广
  • 移动网站开发公司网站制作素材代码
  • 南通网站排名优化国家建设免费论文网站
  • 公司网站推广方法正邦设计作品
  • 做外贸有哪些好的网站有哪些简答网站内容建设的时候内链重要性
  • 博罗网站建设哪家便宜python编程软件用哪个
  • 备案 网站名称 重复wordpress上不去了
  • 宜昌网站建设平台html5手机网站案例
  • 湖南网站建设 尖端磐石网络网站设计师 要求
  • 包装东莞网站建设0769网架公司招聘施工队伍
  • 南昌制作网站的公司网站开发职责
  • 河南洛阳网站建设京东商城在线网上购物
  • dede网站如何做中英文版本商业网站建设视频教程
  • 商城网站建设哪家便宜创建博客网站
  • 济源建设网站网页设计与制作实训室厂家
  • 网站福利你们会回来感谢我的做网站和微信小程序
  • 专业网站建设专业网站设计网页动画设计培训
  • 英文网站seo如何做微信公众号文章编辑wordpress