深度对比简单工厂模式和策略模式

设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析 随着AI技术的不断发展,策略模式与模板方法模式作为设计领域的两颗璀璨明珠,正以其独特的魅力在AI大模型的舞台上展现出无穷的活力与创造力。👍😉 策略模式以其灵活多变的特性,赋予了AI大模型在决策制定中的高度自主性。它使得模型能够根据不同的情境和需求,动态地选择最合适的算法或行为,从而实现高效且精准的决策。这种灵活性和可扩展性,让策略模式成为AI领域中不可或缺的重要工具。😉 模板方法模式则以其稳定可靠的特性,为AI大模型提供了一套标准化的算法框架。让我们一起在AI的世界中继续探索和成长吧!🌟 阅读详情

简单工厂模式 vs 策略模式:UML看着像,核心职责、使用场景、目的完全不同

一、先纠正你的直观错觉:UML结构只是类组成相似,但角色分工、依赖方向、解决问题天差地别

先统一两套模式标准UML角色,再对比差异。

1. 两套模式标准UML角色拆解

(1)简单工厂模式(静态工厂)

角色构成:

  1. 抽象产品 Product:所有产品统一抽象接口(比如 Operation 加减乘除运算)
  2. 具体产品 ConcreteProductA/B/C:实现抽象产品的具体类(Add、Sub、Mul)
  3. 工厂 Factory(核心):唯一创建者,提供静态方法 createProduct(type),根据参数判断,new 对应具体产品实例,返回抽象产品。
  4. 客户端 Client:只依赖「工厂」+「抽象产品」,不直接new具体产品;客户端把创建参数传给工厂,由工厂全权负责实例创建。

UML关系:

  • Factory → 依赖 Product;Factory 实例化 ConcreteProduct
  • Client → 依赖 Factory + Product

核心动作:工厂负责「对象创建」。

(2)策略模式

角色构成:

  1. 抽象策略 Strategy:统一算法接口(比如 PayStrategy 支付:微信/支付宝/银行卡)
  2. 具体策略 ConcreteStrategyA/B/C:实现抽象策略,写不同算法逻辑(WechatPay、AliPay)
  3. 上下文 Context(核心):持有一个 Strategy 成员变量,对外提供业务方法 execute(),内部调用策略的算法;提供 setStrategy() 动态切换策略。
  4. 客户端 Client:自己new具体策略实例,传给Context;客户端自主选择要使用的策略。

UML关系:

  • Context 聚合 Strategy(持有引用)
  • Client → 依赖 Context + Strategy

核心动作:上下文负责「使用算法/执行业务」,策略只封装可变算法。

二、最核心4点本质区别(重点)

区别1:设计目标、解决的问题完全不同

简单工厂:解决「对象创建复杂」的问题

痛点:产品种类多、创建逻辑复杂、创建参数耦合在业务代码里,不想让客户端到处 new XXX()。
核心职责:封装实例化过程,统一对象创建入口。

  • 关注点:怎么造对象
  • 变化点:新增产品时,只改工厂的if/switch判断分支(违反开闭原则,这也是简单工厂不属于GOF23设计模式的原因)
策略模式:解决「算法/业务逻辑频繁变化、大量if-else业务分支」的问题

痛点:同一个业务流程,多种可替换算法;大量if-else嵌套在业务类中,难以维护、扩展。
核心职责:把可变算法抽离独立类,实现算法与业务解耦,动态切换。

  • 关注点:怎么使用对象、运行时切换行为
  • 变化点:新增算法只需要新增ConcreteStrategy,完全不用改Context,符合开闭原则

区别2:核心主控角色完全不一样

  1. 简单工厂核心 = 工厂类 Factory
    所有实例创建逻辑全部收拢在工厂,工厂是整个流程的控制中心;客户端只告诉工厂“我要什么类型”,创建过程完全交给工厂,客户端不参与new具体类。
    示例:客户端传 type="add",工厂内部 new Add() 返回给客户端。
  2. 策略模式核心 = 上下文 Context
    Context是业务载体,负责串联固定业务流程;策略只是一段可替换的逻辑。客户端自己创建具体策略,注入Context;Context只负责调用策略,不负责创建策略。
    示例:客户端 ctx = new OrderContext(); ctx.setStrategy(new WechatPay()); ctx.pay();

区别3:客户端权责、实例创建权归属不同

简单工厂:客户端不创建具体对象,工厂全权创建
// 简单工厂客户端代码
Operation op = OperationFactory.createOperation("+"); // 客户端只传标识,不new Add
int res = op.calc(1,2);
  • 客户端只持有抽象产品,完全不感知具体产品类;
  • 实例创建逻辑被屏蔽在工厂内部。
策略模式:客户端必须手动创建具体策略,注入上下文
// 策略模式客户端代码
PayStrategy pay = new WechatPay(); // 客户端自己new具体策略
OrderContext ctx = new OrderContext(pay);
ctx.doPay(99);
// 运行时动态切换
ctx.setStrategy(new AliPay());
  • 客户端明确知道自己要用哪一个具体策略;
  • Context不会主动创建策略,只负责持有、调用策略。

区别4:开闭原则支持度、扩展代价不同

  1. 简单工厂:不满足开闭原则
    新增一个产品,必须修改工厂里的分支判断(if/switch),修改原有代码,会引入bug风险。
    例:新增除法Div,要去 OperationFactory 加 case "/" : return new Div()。

  2. 策略模式:完美满足开闭原则
    新增算法,只新增一个 ConcreteStrategy 实现类,Context、原有策略完全不用修改,无侵入。
    例:新增数字人民币支付,新建 DigitalRMBPay 实现PayStrategy,上下文一行不用改。

三、举同场景对比示例,直观感受差异

场景:计算器,支持加减乘除四种运算

方案A:用简单工厂实现

  1. 抽象产品:Operation 提供 calc(int a,int b)
  2. 具体产品:Add、Sub、Mul、Div
  3. 工厂:OperationFactory,静态方法根据符号返回运算实例
  4. 客户端:只传符号,由工厂创建运算对象,执行计算

重心:怎么把加减乘除的new操作统一管理起来,避免业务代码到处new。

方案B:用策略模式实现

  1. 抽象策略:CalcStrategy 提供 calc(int a,int b)
  2. 具体策略:AddStrategy、SubStrategy…
  3. 上下文:CalcContext,持有CalcStrategy,提供 execute() 执行计算
  4. 客户端:手动new AddStrategy,传给CalcContext,调用execute;随时替换策略

重心:计算是固定业务流程,加减乘除是可变算法,做到运行时切换算法、解耦业务和计算逻辑。

四、为什么UML图看起来几乎一样?

表层相似点只有2个:

  1. 都存在「抽象父接口 + 多个具体实现类」的分层;
  2. 都有一个中间类(工厂/上下文)依赖顶层抽象接口。

但底层本质完全相反:

  1. 中间类的职责不同:工厂造对象,上下文用对象;
  2. 实例创建主体不同:工厂内部new vs 客户端外部new;
  3. 设计目的不同:封装创建逻辑 vs 封装可变算法;
  4. 扩展特性不同:违反开闭 vs 遵循开闭。

五、快速选择判断口诀

  1. 如果你想统一管理对象的创建过程,屏蔽复杂new逻辑 → 简单工厂;
  2. 如果你有同一套业务流程、多种可替换算法,想消除大量if-else、运行时切换逻辑 → 策略模式;
  3. 如果你既要动态切换算法,又不想客户端手动new策略 → 可以策略+简单工厂组合使用(工厂负责创建策略,注入Context)。

六、补充:组合使用案例(解决策略模式客户端要new的痛点)

把简单工厂嵌入策略模式,工厂负责创建策略,客户端只传标识,既拥有开闭特性,又屏蔽创建逻辑:

// 工厂创建策略
PayStrategy strategy = StrategyFactory.getStrategy("wechat");
OrderContext ctx = new OrderContext(strategy);
ctx.doPay();

此时:

  • 策略模式负责解耦业务与支付算法;
  • 简单工厂负责屏蔽策略实例的创建细节;
    二者各司其职,互不冲突。

C++ 策略模式完整实战示例

业务场景

商场收银系统,3种优惠算法可动态切换:

  1. 正常原价收费
  2. 打折(如8折)
  3. 满减(满300减100)
    同一套收银流程,优惠算法可运行时替换,完美契合策略模式。

模式角色对应

  1. 抽象策略 Strategy:CashStrategy 统一收费算法接口
  2. 具体策略 ConcreteStrategy:正常收费/打折/满减,各自实现计费逻辑
  3. 上下文 Context:CashContext,持有策略对象,对外提供统一收银接口,负责执行算法
  4. 客户端 Client:选择策略、传入上下文、执行计费
#include <iostream>
#include <memory>

// ===================== 1. 抽象策略类:收费算法接口 =====================
class CashStrategy
{
public:
    virtual ~CashStrategy() = default;
    // 接收原价,返回实际收款金额
    virtual double acceptCash(double money) const = 0;
};

// ===================== 2. 具体策略实现类 =====================
// 策略1:正常收费,无优惠
class CashNormal : public CashStrategy
{
public:
    double acceptCash(double money) const override
    {
        return money;
    }
};

// 策略2:打折收费,构造传入折扣(0.8=8折)
class CashRebate : public CashStrategy
{
private:
    double rebate;
public:
    explicit CashRebate(double r) : rebate(r) {}
    double acceptCash(double money) const override
    {
        return money * rebate;
    }
};

// 策略3:满减收费,满condition减reduce
class CashReturn : public CashStrategy
{
private:
    double condition;  // 满多少
    double reduce;     // 减多少
public:
    CashReturn(double cond, double red) : condition(cond), reduce(red) {}
    double acceptCash(double money) const override
    {
        if (money >= condition)
        {
            // 支持多次满减,如满300减100,600减200
            double times = money / condition;
            return money - times * reduce;
        }
        return money;
    }
};

// ===================== 3. 上下文 Context:收银上下文 =====================
// 核心:持有策略对象,封装固定收银流程,对外屏蔽算法细节
class CashContext
{
private:
    std::unique_ptr<CashStrategy> strategy; // 持有策略(聚合关系)
public:
    // 构造注入策略
    explicit CashContext(std::unique_ptr<CashStrategy> s) : strategy(std::move(s)) {}

    // 运行时动态切换策略
    void setStrategy(std::unique_ptr<CashStrategy> s)
    {
        strategy = std::move(s);
    }

    // 统一对外收银接口,内部调用策略算法
    double getResult(double money) const
    {
        return strategy->acceptCash(money);
    }
};

// ===================== 4. 客户端测试代码 =====================
int main()
{
    double originMoney = 1000; // 商品原价1000元

    std::cout << "===== 1. 使用原价策略 =====" << std::endl;
    CashContext ctx1(std::make_unique<CashNormal>());
    std::cout << "应付金额:" << ctx1.getResult(originMoney) << std::endl;

    std::cout << "\n===== 2. 使用8折优惠策略 =====" << std::endl;
    CashContext ctx2(std::make_unique<CashRebate>(0.8));
    std::cout << "应付金额:" << ctx2.getResult(originMoney) << std::endl;

    std::cout << "\n===== 3. 使用满300减100策略 =====" << std::endl;
    CashContext ctx3(std::make_unique<CashReturn>(300, 100));
    std::cout << "应付金额:" << ctx3.getResult(originMoney) << std::endl;

    std::cout << "\n===== 4. 运行时动态切换策略:原价 → 5折 =====" << std::endl;
    CashContext ctx4(std::make_unique<CashNormal>());
    std::cout << "切换前:" << ctx4.getResult(originMoney) << std::endl;
    // 动态替换算法,无需修改上下文代码
    ctx4.setStrategy(std::make_unique<CashRebate>(0.5));
    std::cout << "切换后:" << ctx4.getResult(originMoney) << std::endl;

    return 0;
}

输出结果

===== 1. 使用原价策略 =====
应付金额:1000

===== 2. 使用8折优惠策略 =====
应付金额:800

===== 3. 使用满300减100策略 =====
应付金额:700

===== 4. 运行时动态切换策略:原价 → 5折 =====
切换前:1000
切换后:500

核心特性解读(对应策略模式本质)

  1. 算法与业务解耦
    计费优惠逻辑全部抽离为独立策略类,收银上下文CashContext只关心“收钱”这个固定业务,不关心优惠怎么算。
  2. 运行时动态切换
    setStrategy() 可以在程序运行中替换算法,不需要新建上下文对象。
  3. 符合开闭原则
    新增优惠活动(比如满赠、积分抵扣),只需要新建CashStrategy派生类,不用修改Context和原有策略代码。
  4. UML关系说明
    • CashContext 聚合 CashStrategy(持有指针/智能指针)
    • 多个具体类继承抽象策略
    • 客户端创建具体策略,注入上下文,上下文不负责创建策略(和简单工厂最核心区别)

和简单工厂的关键区分(结合这段代码)

  1. 策略模式:客户端自己make_unique<CashRebate>(0.8)创建策略,上下文只使用、不生产对象;
  2. 简单工厂:会单独写CashFactory,客户端只传字符串"rebate",工厂内部new CashRebate,屏蔽创建细节;
  3. 组合使用方案:可以新增工厂类,封装策略的创建,解决客户端手动new策略繁琐的问题。

拓展:策略+简单工厂 混合改造(简化客户端)

新增工厂,客户端不用手动new各种策略,只传类型标识:

class CashStrategyFactory
{
public:
    static std::unique_ptr<CashStrategy> createStrategy(const std::string& type)
    {
        if (type == "normal")
            return std::make_unique<CashNormal>();
        else if (type == "rebate8")
            return std::make_unique<CashRebate>(0.8);
        else if (type == "return300_100")
            return std::make_unique<CashReturn>(300, 100);
        else
            return std::make_unique<CashNormal>();
    }
};

// 客户端简化写法
CashContext ctx(CashStrategyFactory::createStrategy("rebate8"));


C++ 简单工厂模式完整示例

业务场景

四则计算器:加减乘除运算,由工厂统一创建运算对象,客户端只传运算符,不手动 new 具体运算类。

模式角色

  1. 抽象产品 Product:Operation 运算基类,定义计算接口
  2. 具体产品 ConcreteProduct:Add、Sub、Mul、Div 加减乘除
  3. 工厂 Factory:OperationFactory,静态方法根据标识创建对应运算实例
  4. 客户端 Client:只依赖工厂+抽象产品,屏蔽所有创建细节
#include <iostream>
#include <memory>

// ====================== 1. 抽象产品:运算基类 ======================
class Operation
{
public:
    virtual ~Operation() = default;
    virtual double calc(double a, double b) const = 0;
};

// ====================== 2. 具体产品:四则运算 ======================
// 加法
class Add : public Operation
{
public:
    double calc(double a, double b) const override
    {
        return a + b;
    }
};

// 减法
class Sub : public Operation
{
public:
    double calc(double a, double b) const override
    {
        return a - b;
    }
};

// 乘法
class Mul : public Operation
{
public:
    double calc(double a, double b) const override
    {
        return a * b;
    }
};

// 除法
class Div : public Operation
{
public:
    double calc(double a, double b) const override
    {
        if (b == 0)
        {
            std::cerr << "除数不能为0!" << std::endl;
            return 0;
        }
        return a / b;
    }
};

// ====================== 3. 简单工厂:负责创建运算对象 ======================
class OperationFactory
{
public:
    // 静态工厂方法:根据运算符创建对应运算实例
    static std::unique_ptr<Operation> createOperation(char op)
    {
        switch (op)
        {
        case '+':
            return std::make_unique<Add>();
        case '-':
            return std::make_unique<Sub>();
        case '*':
            return std::make_unique<Mul>();
        case '/':
            return std::make_unique<Div>();
        default:
            std::cerr << "不支持的运算符!" << std::endl;
            return nullptr;
        }
    }
};

// ====================== 4. 客户端调用 ======================
int main()
{
    double num1 = 10, num2 = 2;

    // 客户端只传入运算符,完全不用 new Add/Sub/Mul/Div
    auto opAdd = OperationFactory::createOperation('+');
    std::cout << "10 + 2 = " << opAdd->calc(num1, num2) << std::endl;

    auto opSub = OperationFactory::createOperation('-');
    std::cout << "10 - 2 = " << opSub->calc(num1, num2) << std::endl;

    auto opMul = OperationFactory::createOperation('*');
    std::cout << "10 * 2 = " << opMul->calc(num1, num2) << std::endl;

    auto opDiv = OperationFactory::createOperation('/');
    std::cout << "10 / 2 = " << opDiv->calc(num1, num2) << std::endl;

    return 0;
}

运行输出

10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5

核心特点(简单工厂标志性特征)

  1. 创建逻辑全部收拢在工厂
    所有 new 操作都在 createOperation 内部,客户端看不到具体子类;
  2. 违反开闭原则
    如果新增「取余%」运算,必须修改工厂里的 switch 分支,改动原有代码;
  3. 工厂是唯一创建入口
    客户端只能通过工厂获取对象,无权直接实例化具体产品;
  4. 关注点:对象创建
    只解决“如何生产对象”,不负责对象的业务执行。

和之前策略模式的核心对比(结合两份代码)

  1. 简单工厂:工厂负责 new 对象,客户端只拿抽象产品直接调用方法;没有 Context 上下文;
  2. 策略模式:客户端自己 new 策略对象,注入 Context;Context 只使用策略,绝不创建策略;
  3. 组合用法:可以把简单工厂嵌入策略模式,由工厂帮客户端创建策略,简化调用。
深度解析:Map + 函数式接口实现策略模式(从基础到工程化实践) 用枚举定义支付类型,替代之前的纯数字1/2/3// 支付方式枚举(策略选择条件的枚举化)ALIPAY(1, "支付宝"),WECHAT_PAY(2, "微信支付"),UNION_PAY(3, "银联支付");// 构造器、getter 省略解耦逻辑:用 Map 替代if-else,避免逻辑耦合;减少冗余:无需为每个策略创建独立类,复用现有方法;灵活扩展:支持动态注册策略,适应多变的业务需求。 阅读详情

相关推荐

策略模式(Strategy Pattern)深度解析教程!

在开发过程中,常常会遇到这样的需求:同一操作在不同的场景下可能会有不同的实现方式。比如,一个系统中可能有多个排序算法,根据不同的数据和场景选择不同的排序方式,或者在支付系统中,不同的支付方式采用不同的支付策略。为了处理这些场景,设计模式提供了许多有用的解决方案,其中策略模式(Strategy Pattern)就是一个非常实用的模式。今天,我们将通过一个详细的示例和深入的分析,帮助你更好地理解策略模式的核心思想、应用场景及实现方式。

喵手的博客 1016

DataComPy 源码深度剖析:策略模式如何撑起 4 种 DataFrame 对比引擎

DataComPy 是一个用 Python 编写的开源 DataFrame 对比库,一个库就能完成 Pandas、Polars、Spark、Snowflake 四种 DataFrame 后端的表级对比,输出人类可读的对比报告。本文从源码出发,带你拆解它如何用「策略模式」把 4 种后端的差异隔离在各自模块里,让对比引擎既统一又可扩展。 ## 项目速览:一个接口,4 个后端 DataComPy 的

gitblog_00827的博客 943

UWB学习——day4

总的来说,BPM-BPSK调制方案是一种利用脉冲位置和相位来编码信息的高效数字调制技术,特别适用于UWB通信系统,以实现高速数据传输和频谱效率。这种方式将时间和相位综合使用,从而提高了数据传输的容量。总之,超外差结构是一种接收器设计,通过将不同频率的信号转换到一个共同的中间频率来提高信号选择性和抗干扰性。超外差结构是一种用于接收器的电子电路设计,它的目标是从无线信号中提取有用的信息,比如音频、数据或图像。该芯片的接收机是超外差结构,所谓超外差结构一种基于频率转换的接收器架构,旨在提高信号选择性和抗干扰性。

许帅的博客 2557

【151期】面试官:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别?

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2401_84048034的博客 592

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4042

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 3000

AI大模型下的策略模式与模板方法模式对比解析

随着AI技术的不断发展,策略模式与模板方法模式作为设计领域的两颗璀璨明珠,正以其独特的魅力在AI大模型的舞台上展现出无穷的活力与创造力。👍😉 策略模式以其灵活多变的特性,赋予了AI大模型在决策制定中的高度自主性。它使得模型能够根据不同的情境和需求,动态地选择最合适的算法或行为,从而实现高效且精准的决策。这种灵活性和可扩展性,让策略模式成为AI领域中不可或缺的重要工具。😉 模板方法模式则以其稳定可靠的特性,为AI大模型提供了一套标准化的算法框架。

Boutique_41精品店的博客 2042

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 297

【策略模式】最佳实践——Spring IoC实现策略模式全流程深度解析

策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,并且使算法的变化不会影响使用算法的客户端。策略模式通过将具体的业务逻辑从上下文(Context)中剥离出来,独立为策略类,动态地将所需的行为注入上下文对象中,从而避免代码中充斥条件判断逻辑。

k123456kah的博客 1796

AI变现案例实战系列4:AI数字员工团队——用OpenClaw搭建6个智能体,自动运营你的赚钱系统

摘要:谷歌AI产品经理Shubham Saboo利用OpenClaw搭建6人AI团队,实现内容创作、技术开发等任务自动化,每月成本不足400美元。文章对比阿里云和Windows本地两种部署方案,提供详细配置指南。通过多Agent架构实现物理隔离与精准协作,可创建6个专业AI角色(如研究员、运营、工程师等),每个Agent专注单一任务,避免记忆负担和上下文污染问题。阿里云方案适合长期稳定运行,Windows本地部署则适合零成本测试。最终可组建高效AI团队,实现7x24小时无人值守运营。(149字)

小明的博客 1141

基于Matlab模拟六自由度Stewart并联机器人运动学逆解

在现代工业和科学领域中,机器人技术的发展已经取得了巨大的进步,为生产和研究提供了许多便利。其中,六自由度Stewart并联机器人是一种广泛应用于各种领域的机器人系统。它具有高精度、高刚度和高可靠性的特点,被广泛应用于飞行模拟器、手术机器人和运动仿真等领域。然而,要使Stewart并联机器人能够实现复杂的运动任务,我们需要了解其运动学逆解。运动学逆解是指根据机器人末端执行器的位置和姿态,计算出各个关节的角度和长度。这对于控制机器人的运动非常重要,因为它可以帮助我们确定机器人各个关节的运动范围和工作空间。

qq_59747472的博客 1128

设计模式——简单工厂+策略模式

主要参考:《大话设计模式》 1.简单工厂模式: 输入:对象特征(字符串) 输出:对象 方法:Factory,选取对象 选取方式:利用switch选取对象。 优点:客户不需要知道具体调用哪个对象,只需要知道使用该对象特征。 弱点:封装性不够高,客户端须知道工厂与需操作对象(抽象类)两个类。 2.策略模式: 输入:需操作的对象 输出:最终结果 方法:Result,统一调用

DirkNow的专栏 1050

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2657

策略模式(大话设计模式)C/C++版本

商场收银软件根据客户所购买商品的单价和数量来收费。

m0_47104421的博客 532

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度解析策略模式:从理论到企业级实战应用

orElseThrow(() -> new RuntimeException("未找到支付策略"));策略模式(Strategy Pattern)是行为型设计模式的典型代表,其核心思想是。| 支付宝策略 | 微信支付策略 | 银联策略。// 动态加载策略类。// 调用支付宝SDK。(OCP):新增策略无需修改已有代码。// 实现策略(带Spring注解)// 支付宝支付逻辑。// 策略上下文(自动注入策略集合)[支付请求] --> [支付网关]// 策略工厂(自动发现策略)

m0_61715294的博客 1512

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

什么是策略模式?策略模式能带来什么?——策略模式深度解析:从概念本质到Java实战的全维度指南

本文摘要: 策略模式是一种行为设计模式,通过将算法封装为独立对象实现动态切换,完美解决业务逻辑频繁变更的问题。文章以电商折扣场景为例,系统解析了策略模式的三层架构(策略接口、具体策略、上下文类),并对比传统if-else实现,突出其四大核心优势: 1)逻辑解耦提升可维护性 2)运行时动态切换策略 3)天然支持开闭原则 4)增强单元测试可行性。通过Java代码示例演示了从基础实现到Spring集成的完整方案,为复杂业务系统的可扩展设计提供标准化范式。

1310

Java设计模式:策略模式与工厂模式深度解析

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户端而变化。简单来说,当你需要根据不同的情况选择不同的算法或行为时,策略模式就能派上用场。工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需在代码中显式指定要创建的对象的具体类。工厂模式将对象的实例化过程封装起来,使客户端与具体类的实现解耦。策略模式和工厂模式都是Java中非常重要的设计模式。策略模式侧重于封装行为,让行为在运行时可以自由切换,解决了“做什么”的问题。工厂模式。

2501_91015529的博客 868

深度学习设计模式之策略模式

策略模式定义一系列算法,封装每个算法,并使它们可以互换。策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换,算法的变化不会影响到使用算法的客户。Strategy(策略接口):定义所有支持的算法的公共接口。ConcreteStrategy(具体策略类):实现Strategy接口,提供具体的算法实现。Context(上下文环境):使用策略接口与具体的策略类交互,持有一个策略对象的引用。

G_whang的博客 1589

【设计模式系列】策略模式vs模板模式

确实,模板模式和策略模式在结构上有相似之处,但它们的设计意图和应用场景有本质区别。下面我将详细分析两者的异同,并通过典型场景的代码示例展示它们的区别。应用场景:当需要根据不同条件选择不同算法或行为时,将算法封装成独立的策略类,使它们可以互相替换。应用场景:当需要根据不同条件选择不同算法或行为时,将算法封装成独立的策略类,使它们可以互相替换。

weixin_38148171的博客 719

java设计模式深度解析与实践:策略模式

通过本文,我们了解了策略模式的核心思想、实现方法以及适用场景。策略模式就像一个“瑞士军刀”,能够帮助我们轻松管理和切换不同的算法或行为。我是Java编程小能手,后续会带来更多有趣的设计模式和Java干货内容,欢迎随时交流~ 😄关注我,一起成为Java编程高手!

panqiangqiangqiang的博客 864

最有深度的策略模式解析

在生活中我们在做商品促销时,会针对不同的客户有多同的折扣价格,新客户不打折,老客户打九折,vip打八折等等。这就要我们针对不同的客户有不同的定价策略。 所以我会可能会有如下的代码 public class QuoteManager { public BigDecimal quote(BigDecimal originalPrice,String customType){ ...

qq_25933249的博客 434
上一篇: C++ 虚继承对象内存布局
下一篇: 建造者模式和模板方法模式的区别
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值