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

文章目录

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

相同点:

都涉及到对象的创建和使用。在简单工厂模式中,工厂类负责创建对象;在策略模式中,虽然重点是算法的封装和切换,但具体策略类也是对象,需要被创建。

都有助于提高代码的可维护性和可扩展性。简单工厂模式将对象创建逻辑集中在工厂类中,方便添加新的产品对象;策略模式将不同的算法封装在具体策略类中,便于添加新的策略。

不同点:

目的:

简单工厂模式主要用于创建对象,它将对象的创建和使用分离。例如,在一个游戏道具系统中,简单工厂模式可以用来创建不同类型的道具,如武器、防具等。

策略模式侧重于在运行时切换算法或行为。例如,在游戏角色的攻击行为中,可以有不同的攻击策略,如近战攻击、远程攻击等,根据游戏场景和角色状态来切换。

结构:

简单工厂模式通常有一个工厂类,包含一个创建对象的方法,根据传入的参数返回不同类型的产品对象。

策略模式包含一个策略接口、多个具体策略类和一个上下文类。策略接口定义了算法方法,具体策略类实现这些方法,上下文类持有策略接口引用,用于调用具体策略类的算法。

C++ 代码示例

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

cpp 复制代码
// 抽象图形类
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;
}

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

cpp 复制代码
// 折扣策略接口
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区别


相关推荐
harder3211 天前
Swift 面向协议编程的 RMP 模式
开发语言·ios·mvc·swift·策略模式
skywalk81632 天前
esxi8 虚拟机中怎么安装mac os(纯AI回答,未实践)
策略模式·esxi
廖圣平2 天前
从零开始,福袋直播间脚本研究【八】《策略模式》
开发语言·python·bash·策略模式
爱学习 爱分享6 天前
简单工厂模式和策略模式的区别
简单工厂模式·策略模式
xcntime9 天前
Python中print函数如何实现不换行输出?
策略模式
青春易逝丶10 天前
策略模式
java·开发语言·策略模式
sg_knight10 天前
设计模式实战:策略模式(Strategy)
java·开发语言·python·设计模式·重构·架构·策略模式
liangshanbo121510 天前
[特殊字符] macOS 上的 zoxide:智能目录跳转终极指南
macos·策略模式
Rabbit_QL12 天前
【Warp+Claude】任务完成自动通知(macOS + Warp 版)
macos·策略模式
Sahadev_13 天前
macOS 解决 AirDrop 传输应用“已损坏“问题,以sublime为例
macos·策略模式·sublime text