简单工厂模式和策略模式的异同

news/2024/12/22 8:07:27/

文章目录

简单工厂模式策略模式的异同

相同点:

都涉及到对象的创建和使用。在简单工厂模式中,工厂类负责创建对象;在策略模式中,虽然重点是算法的封装和切换,但具体策略类也是对象,需要被创建。
都有助于提高代码的可维护性和可扩展性。简单工厂模式将对象创建逻辑集中在工厂类中,方便添加新的产品对象;策略模式将不同的算法封装在具体策略类中,便于添加新的策略。

不同点:

目的:

简单工厂模式主要用于创建对象,它将对象的创建和使用分离。例如,在一个游戏道具系统中,简单工厂模式可以用来创建不同类型的道具,如武器、防具等。
策略模式侧重于在运行时切换算法或行为。例如,在游戏角色的攻击行为中,可以有不同的攻击策略,如近战攻击、远程攻击等,根据游戏场景和角色状态来切换。

结构:

简单工厂模式通常有一个工厂类,包含一个创建对象的方法,根据传入的参数返回不同类型的产品对象。
策略模式包含一个策略接口、多个具体策略类和一个上下文类。策略接口定义了算法方法,具体策略类实现这些方法,上下文类持有策略接口引用,用于调用具体策略类的算法。

C++ 代码示例

简单工厂模式示例(以创建图形对象为例)

// 抽象图形类
class Shape{
public:virtual void draw() = 0;
};// 具体图形类 - 圆形
class Circle : public Shape 
{
public:void draw() override{std::cout << "Drawing a circle." << std::endl;}
};// 具体图形类 - 矩形
class Rectangle : public Shape
{
public:void draw() override {std::cout << "Drawing a rectangle." << std::endl;}
};// 简单工厂类
class ShapeFactory 
{
public:static Shape* createShape(const std::string& shapeType){if (shapeType == "circle") {return new Circle();}else if (shapeType == "rectangle") {return new Rectangle();}return nullptr;}
};int main() 
{Shape* circle = ShapeFactory::createShape("circle");circle->draw();Shape* rectangle = ShapeFactory::createShape("rectangle");rectangle->draw();delete circle;delete rectangle;return 0;
}

策略模式示例(以计算价格折扣策略为例)

// 折扣策略接口
class DiscountStrategy
{
public:virtual double calculateDiscount(double price) = 0;
};// 具体折扣策略类 - 满减折扣
class FullReductionDiscount : public DiscountStrategy 
{
public:double calculateDiscount(double price) override {if (price >= 100) {return 20;}return 0;}
};// 具体折扣策略类 - 会员折扣
class MemberDiscount : public DiscountStrategy 
{
public:double calculateDiscount(double price) override {return price * 0.1;}
};// 上下文类
class PriceContext 
{
private:DiscountStrategy* discountStrategy;
public:PriceContext(DiscountStrategy* strategy) : discountStrategy(strategy) {}double calculateFinalPrice(double price) {double discount = discountStrategy->calculateDiscount(price);return price - discount;}
};int main() 
{FullReductionDiscount fullReduction;PriceContext fullReductionContext(&fullReduction);double price1 = fullReductionContext.calculateFinalPrice(120);std::cout << "Final price after full - reduction discount: " << price1 << std::endl;MemberDiscount memberDiscount;PriceContext memberDiscountContext(&memberDiscount);double price2 = memberDiscountContext.calculateFinalPrice(80);std::cout << "Final price after member discount: " << price2 << std::endl;return 0;
}

在上述代码中:
简单工厂模式的代码通过ShapeFactory创建不同类型的Shape对象(Circle和Rectangle)。工厂类的createShape方法根据传入的字符串参数决定创建哪种具体的图形对象。
策略模式的代码定义了DiscountStrategy接口,有FullReductionDiscount和MemberDiscount两个具体策略类实现了不同的折扣计算方法。PriceContext作为上下文类,根据传入的折扣策略对象来计算最终价格,通过这种方式可以在运行时灵活切换折扣策略。

UML区别

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1557143.html

相关文章

stm32进硬件错误怎么回事

STM32进入硬件错误状态&#xff0c;通常是由一些特定的编程或硬件问题引起的。以下是一些可能的原因及相应的解决方法&#xff1a; 可能的原因 数组越界操作&#xff1a;在编程过程中&#xff0c;如果数组访问超出了其定义的边界&#xff0c;可能会导致内存访问错误&#xff0…

电脑提示ntdll.d缺失是什么原因?不处理的话会怎么样?ntdll.dll文件缺失快速解决方案来啦!

电脑提示ntdll.dll缺失&#xff1a;原因、影响与解决方案 在日常的电脑使用中&#xff0c;我们偶尔会遇到一些令人困惑的系统错误&#xff0c;其中“ntdll.dll缺失”便是较为常见的一种。作为软件开发从业者&#xff0c;我深知这一错误给用户带来的不便&#xff0c;因此&#…

人脸修复与增强腾讯开源项目GFPGAN介绍

GFPGAN 简述 GFPGAN (Generative Facial Prior GAN) 是一种基于生成对抗网络&#xff08;GAN&#xff09;的面部图像修复与增强模型。它由腾讯 ARC Lab 的研究团队开发&#xff0c;目的是以高效和高质量的方式修复低分辨率、受损或老化的人脸图像&#xff0c;同时保留其真实感和…

13、基于SpringBoot的旅游网站的设计与实现

随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游网站方式&#xff0c;不仅使旅游管理难度变…

Go 语言GC(垃圾回收)的工作原理

Go语言的垃圾回收&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;机制是一种自动的内存管理方法&#xff0c;它负责自动释放不再使用的内存&#xff0c;以避免内存泄漏和碎片化。Go语言的GC工作原理主要基于标记-清除&#xff08;mark-and-sweep&#xff09;算法…

Java-29 深入浅出 Spring - IoC 基础 启动IoC容器的方式 Java方式与Web(XML、配置)方式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

硬盘接口模式sata与ahci区别, U盘UEFI GPT与Legacy 启动项区别,硬盘格式MBR和gpt的区别

一。SATA和AHCI的主要区别在于它们的功能、接口类型和性能。‌ 功能和性能 SATA‌&#xff1a;Serial ATA&#xff08;SATA&#xff09;是一种硬盘接口标准&#xff0c;主要用于连接存储设备&#xff08;如硬盘&#xff09;到主机&#xff08;如主板&#xff09;。它经历了多个…

QMainwindow的鼠标跟踪事件不触发问题

一、无边框窗口实现代码 1.1 头文件 class EtcTestTool : public QMainWindow {Q_OBJECTpublic:EtcTestTool(QWidget *parent Q_NULLPTR); private:void InitialUi();//... protected:void mousePressEvent(QMouseEvent*event)override;void mouseReleaseEvent(QMouseEvent*…