首页 > 其他分享 >设计模式 经典问题

设计模式 经典问题

时间:2024-01-17 21:35:15浏览次数:28  
标签:arr int 类图 模式 工厂 问题 经典 设计模式 public

目录


策略模式和简单工厂模式的区别

策略模式和简单工厂模式是两种不同的设计模式,它们在用途和实现上有所不同。

  • 简单工厂模式是一种创建型模式,用于创建特定类型的对象。它通过一个工厂类来创建对象,根据不同的条件返回不同的对象实例。简单工厂模式关注的是对象的创建。
  • 策略模式是一种行为型模式,允许类在运行时切换或运行不同的算法。策略模式允许类以不同的方式执行特定任务,而不需要了解具体的算法实现细节。策略模式关注的是在运行时选择不同的算法。

下面是一个关于这两种模式的示例代码:

// 策略模式示例
#include <iostream>
using namespace std;

class SortAlgorithm {
public:
    virtual void sort(int arr[], int size) = 0;
};

class QuickSort : public SortAlgorithm {
public:
    void sort(int arr[], int size) override {
        // 实现快速排序算法
    }
};

class MergeSort : public SortAlgorithm {
public:
    void sort(int arr[], int size) override {
        // 实现归并排序算法
    }
};

class SortContext {
private:
    SortAlgorithm* strategy;
public:
    void setStrategy(SortAlgorithm* sortAlgorithm) {
        strategy = sortAlgorithm;
    }

    void performSort(int arr[], int size) {
        strategy->sort(arr, size);
    }
};

int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    int size = sizeof(arr) / sizeof(arr[0]);

    SortContext context;
    context.setStrategy(new QuickSort());
    context.performSort(arr, size);

    return 0;
}
// 简单工厂模式示例
#include <iostream>
using namespace std;

class Product {
public:
    virtual void operation() = 0;
};

class ConcreteProductA : public Product {
public:
    void operation() override {
        cout << "Operation A" << endl;
    }
};

class ConcreteProductB : public Product {
public:
    void operation() override {
        cout << "Operation B" << endl;
    }
};

class SimpleFactory {
public:
    Product* createProduct(int type) {
        if (type == 1) {
            return new ConcreteProductA();
        } else if (type == 2) {
            return new ConcreteProductB();
        } else {
            return nullptr;
        }
    }
};

int main() {
    SimpleFactory factory;
    Product* productA = factory.createProduct(1);
    Product* productB = factory.createProduct(2);

    productA->operation();
    productB->operation();

    return 0;
}

在上面的示例中,策略模式允许在运行时切换排序算法,而简单工厂模式用于创建不同的产品实例。


策略模式的类图为什么采用聚合

策略模式的类图采用聚合是为了表示Context类与Strategy类之间的关系。在策略模式中,Context类需要持有一个Strategy类的引用,以便在运行时能够动态地切换不同的策略。这种关系可以用聚合来表示,聚合表示一种弱拥有关系,即Context类拥有Strategy类的引用,但并不拥有Strategy类的生命周期。这种设计使得Context类能够与不同的策略进行交互,同时保持了灵活性和可维护性。


简单工厂模式的类图为什么采用关联表示

简单工厂模式的类图采用关联表示是因为简单工厂模式中的工厂类和产品类之间存在一种关联关系。工厂类通过关联关系来创建产品类的实例,从而实现了对象的创建和解耦。在类图中使用关联表示这种关系,能够清晰地展现出工厂类和产品类之间的依赖关系,有助于理解和设计该模式的结构。

以下是一个简单工厂模式的类图示例,其中使用关联表示工厂类和产品类之间的关系:

  +-----------------+       +-----------------+
  |   SimpleFactory |------>|     Product     |
  +-----------------+       +-----------------+

在上面的示例中,SimpleFactory 工厂类与 Product 产品类之间通过关联表示了它们之间的关系。这种关联关系是简单工厂模式中非常重要的一部分,因为工厂类通过关联关系来创建产品类的实例,实现了对象的创建和解耦。

因此,简单工厂模式的类图采用关联表示是为了清晰地展现工厂类和产品类之间的依赖关系,有助于理解和设计该模式的结构。

标签:arr,int,类图,模式,工厂,问题,经典,设计模式,public
From: https://www.cnblogs.com/yubo-guan/p/17971206

相关文章

  • 3254:约瑟夫问题No.2C
    做个循环列表就行了。逻辑上想想还是很简单的。然而在实践的时候需要考虑许多边界情况。每次循环的时候要考虑头节点的问题。#include<stdio.h>#include<stdlib.h>structnode{intdata;structnode*next;};typedefstructnodeqlist;intmain(){qlist......
  • Chat GPT解决工作问题
    要使用Python提取一个文件夹下所有.ogg文件的文件名,并将这些文件名输出到一个文本文件中,你可以使用以下代码: importos#设置文件夹路径directory='/path/to/your/directory'#设置输出文件的路径output_file='/path/to/your/output.txt'#创建一个空列表来存储文......
  • 3254:约瑟夫问题No.2C++
    \这题思路还是挺多的。如果用数学的角度考虑。知道了n,p,m自然就知道下一个要出队的人的编号。然后一个个输出就行了。还可以用循环链表做。还可以用队列。出队在入队。#include<iostream>#include<queue>usingnamespacestd;intmain(){intn,p,m;while(......
  • springMvc如何解决请求中文乱码问题
    方式一:解决get请求中文乱码问题  每次请求前用encode对url进行编码方式二:在应用服务器上配置URL编码格式,在tomcat配置文件server.xml增加encodeURL编码格式,然后重启解决post请求方式一:使用spring提供的编码过器 在web.xml文件配置编码过lu器,增加一下配置: <web-ap......
  • vue+tsc+noEmit导致打包报TS类型错误问题及解决方法
    当我们新建vue3项目,package.json文件会自动给我添加一些配置选项,这写选项基本没有问题,但是在实际操作过程中,当项目越来越复杂就会出现问题。本文列举一个目前我遇到的一个问题:打包后报了一堆TS类型错误,怎么消除这些错误?项目环境:Vue3+Vite+TS当项目进行打包时候,突然发现终端......
  • RTSP/Onvif安防视频云平台EasyNVR迁移盘符后启动异常的问题排查与解决
    EasyNVR安防视频云平台可支持设备通过RTSP/Onvif协议接入,并进行视频流的处理及分发,在视频监控场景中可实现视频实时监控直播、云端录像、云存储、录像检索与回看、告警、级联等,平台能将拉取过来的音视频流转化成适合全平台播放的RTMP、RTSP、hTTP-FLV、Websocket-FLV、HLS、WebRTC......
  • vue-element-admin/litemall后端,超过两级嵌套路由无法缓存的问题
    本文主要针对的是litemall后端,vue-element-admin只需稍作修改应该也可以适用。路由扁平的思路主要来源于https://blog.csdn.net/weixin_40119256/article/details/111475571,另外解决面包屑显示问题,此文章作记录以供有需要的同行参考。keep-alive用于缓存不活跃的组件实例,避免重......
  • 解决Python虚拟环境安装模块失败的问题
    Python虚拟环境的出现为我们创建和管理项目提供了很大的方便。通过虚拟环境,我们可以隔离不同项目的依赖包,避免版本冲突和混乱。然而,有时候在虚拟环境中安装模块时会遇到各种问题,例如找不到模块、安装超时等。下面将介绍几种常见的情况和相应的解决方法,以帮助您顺利安装模块。1.网络......
  • 解决PyCharm显示"No Python Interpreter configured for the project"的问题
    PyCharm提供了许多功能和工具,以帮助开发人员编写、调试和运行Python程序。但是,在启动新项目或打开现有项目时,有时会出现"NoPythonInterpreterconfiguredfortheproject"的错误提示。这意味着PyCharm无法找到配置的Python解释器,导致无法正常运行代码。下面将介绍可能导致此问......
  • ETLCloud详解,如何实现最佳实践及问题排查
    ETLCloud介绍ETLCloud是新一代全域数据集成平台,领先于市场同类产品的数据集成平台(DataOps),只需单击几下即可完成数据清洗转换、传输入仓等操作,具备高效、智能、一站式的全域数据集成优势,如:毫秒级实时数据同步支持异构数据源实时数据监听读取,实时数据通过经过清选、转换后可以实时......