首页 > 其他分享 >工厂模式与策略模式:理解与应用

工厂模式与策略模式:理解与应用

时间:2024-08-24 15:27:11浏览次数:9  
标签:咖啡 策略 模式 工厂 理解 basePrice public

工厂模式与策略模式:理解与应用


在面向对象的设计中,工厂模式和策略模式是非常重要的两种设计模式。它们虽然有着不同的应用场景,但在很多方面都有一定的相似性,使得容易混淆。本文清晰地阐述这两种模式之间的区别,并探讨它们的应用场景。

1. 引言

工厂模式和策略模式都是广泛使用的模式,它们各自解决了不同层面的问题。接下来将分别介绍这两种模式的基本概念、特点以及应用场景。

2. 工厂模式简介

2.1 定义

工厂模式是一种创建型设计模式,它提供了创建对象的最佳方式。在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式的核心思想是将对象的创建与使用分离,通过一个工厂类来负责创建产品族中的各种实例。

2.2 特点

  • 封装创建逻辑:工厂方法隐藏了具体的创建逻辑,使客户端无需关心创建过程。
  • 易于扩展:新增产品类型时只需添加相应的实现类和工厂类即可,符合开闭原则。
  • 解耦:客户端与具体的产品类解耦,只与抽象接口交互。

2.3 应用场景

  • 当类的实例只能由直接调用构造函数创建时,可以使用工厂模式来提供一个统一的创建入口。
  • 当一个类不知道它所必须创建的对象的确切类时。
  • 当一个类希望由它的子类指定它所创建的对象时。

2.4 工厂模式例子:咖啡制作

在这个例子中,工厂模式用于创建不同类型的咖啡。

// 咖啡接口
interface Coffee {
    void brew();
}
// 具体的咖啡类
class Espresso implements Coffee {
    @Override
    public void brew() {
        System.out.println("制作浓缩咖啡");
    }
}

class Latte implements Coffee {
    @Override
    public void brew() {
        System.out.println("制作拿铁咖啡");
    }
}
// 咖啡工厂
class CoffeeFactory {
    public Coffee createCoffee(String type) {
        if ("espresso".equalsIgnoreCase(type)) {
            return new Espresso();
        } else if ("latte".equalsIgnoreCase(type)) {
            return new Latte();
        }
        throw new IllegalArgumentException("未知的咖啡类型");
    }
}
// 使用
public class CoffeeShop {
    public static void main(String[] args) {
        CoffeeFactory factory = new CoffeeFactory();
        
        Coffee espresso = factory.createCoffee("espresso");
        espresso.brew();  // 输出:制作浓缩咖啡
        
        Coffee latte = factory.createCoffee("latte");
        latte.brew();  // 输出:制作拿铁咖啡
    }
}

在这个例子中,工厂模式用于创建不同类型的咖啡对象。客户端只需要知道想要的咖啡类型,而不需要了解具体的咖啡类。

3. 策略模式简介

3.1 定义

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户端。

3.2 特点

  • 灵活性:策略模式允许在运行时选择算法。
  • 易于维护:每个策略都是独立的,易于理解和维护。
  • 减少条件分支:使用策略模式可以减少代码中的 if-else 或 switch-case 语句。

3.3 应用场景

  • 当一个系统需要根据不同条件执行不同的算法或行为时。
  • 当一个系统需要动态地更改其行为时。

3.4 策略模式例子:咖啡定价

使用策略模式来处理咖啡的定价策略。

// 定价策略接口
interface PricingStrategy {
    double calculatePrice(double basePrice);
}
// 具体的定价策略
class RegularPricing implements PricingStrategy {
    @Override
    public double calculatePrice(double basePrice) {
        return basePrice;  // regular price, no discount
    }
}

class DiscountPricing implements PricingStrategy {
    @Override
    public double calculatePrice(double basePrice) {
        return basePrice * 0.9;  // 10% discount
    }
}

class HappyHourPricing implements PricingStrategy {
    @Override
    public double calculatePrice(double basePrice) {
        return basePrice * 0.5;  // 50% discount during happy hour
    }
}
// 咖啡订单类
class CoffeeOrder {
    private PricingStrategy pricingStrategy;
    private double basePrice;

    public CoffeeOrder(double basePrice) {
        this.basePrice = basePrice;
        this.pricingStrategy = new RegularPricing();  // 默认使用常规定价
    }

    public void setPricingStrategy(PricingStrategy pricingStrategy) {
        this.pricingStrategy = pricingStrategy;
    }

    public double getFinalPrice() {
        return pricingStrategy.calculatePrice(basePrice);
    }
}
// 使用
public class CoffeeShopPricing {
    public static void main(String[] args) {
        CoffeeOrder order = new CoffeeOrder(5.0);  // 咖啡基础价格为 $5
        
        System.out.println("Regular price: $" + order.getFinalPrice());
        
        order.setPricingStrategy(new DiscountPricing());
        System.out.println("Discounted price: $" + order.getFinalPrice());
        
        order.setPricingStrategy(new HappyHourPricing());
        System.out.println("Happy hour price: $" + order.getFinalPrice());
    }
}

在这个例子中,策略模式用于在运行时改变价格计算的方法。咖啡订单类可以动态地改变其定价策略,而无需修改订单类的代码。

4. 区别

尽管工厂模式和策略模式在某些方面相似,但它们之间还是存在明显的区别:

4.1 目的不同

  • 工厂模式:主要目的是创建对象实例,封装了对象创建的过程。
  • 策略模式:关注的是如何在运行时选择和替换算法。

4.2 应用场景不同

  • 工厂模式:适用于创建多种不同类型的对象。
  • 策略模式:适用于具有多种算法或行为的系统。

4.3 解决问题不同

  • 工厂模式:解决对象创建的问题。
  • 策略模式:解决算法或行为的选择和切换问题。

4.4 设计原理不同

  • 工厂模式:遵循开闭原则,通过抽象类或接口来实现。
  • 策略模式:通过组合而非继承来实现行为的改变。

5. 结论

工厂模式和策略模式都是设计模式的重要组成部分。工厂模式关注于对象的创建过程,而策略模式则关注于算法的选择与替换。理解它们之间的差异有助于在设计时做出合适的选择。


标签:咖啡,策略,模式,工厂,理解,basePrice,public
From: https://blog.csdn.net/weixin_42564451/article/details/141470966

相关文章

  • 设计模式之工厂方法模式
      简单工厂模式虽然简单,但是存在一个问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提......
  • 设计模式之简单工厂模式
     简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。1.Factory:工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。在工厂类中提供了静态的工厂方法factoryMet......
  • 设计模式之单例模式
    创建型模式将对象的创建和使用分离,在使用对象时无需关注对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。模式名称定义学习难度使用频率单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例一颗星四颗星简单工厂模式定义一......
  • 理解MySQL——索引与优化
    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页......
  • 前端宝典十六:深入浅出8大设计模式
    本文主要探讨前端开发中的各种设计模式,主要分类有:单例模式建造者模式代理模式装饰器模式适配器模式策略模式观察者模式发布订阅模式通过对他们实际开发中的使用场景的解析,深入浅出的一起更全面直观的进行学习:一、单例模式介绍:单例模式确保一个类只有一个实例,并提供一个......
  • uefi模式无法读取u盘启动怎么办_uefi模式无法读取u盘启动解决方法
    最近有网友问我uefi模式下我按快捷方式或bios中都认别不了U盘,无法正常选择u盘启动进入pe安装系统,出现这种情况一般是bios中设置了uefi模式,而制作的u盘启动不支持uefi启动导致,那么uefi模式无法读取U盘启动怎么办?下面小编就教大家uefi模式无法读取u盘启动解决方法步骤。 u......
  • 商业预付费电能管理解决方案
    安科瑞徐赟杰商业预付费电能管理解决方案大型商业项目的能源消耗量高,一般为住宅的10-15倍,普通公共建筑的3-5倍。作为商业地产的物业管理层,希望他们的用电费用回收越快越好,更进一步的可能需要一个简单便捷的收集、并清楚显示商场内每个商铺的电耗信息的系统。系统建设的意义:......
  • 设计模式(三)
    结构型模式装饰器模式:动态的给一个对象增加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。优/缺点:装饰模式是继承关系的一个替代方案。装饰模式可以动态地扩展一个实现类的功能。缺点:多层的装饰还是比较复杂何时使用:需要扩展一个类的功能,或给一个类增加附加功......
  • lua协程实现异步编程模式
    异步编程模式只是一个代码结构,c#中的async/await的写法就是异步编程模式,这边就是通过协程来达到和async/await类似的效果。 异步编程模式写法1:资源分帧加载这边运行环境用的是:Unity+xLua lua脚本:Assets/Lua/Test9.lua.txtlocal_Time=CS.UnityEngine.Timelocalfunct......
  • 汇编语言中的高效引擎:深入理解流水线技术
    标题:汇编语言中的高效引擎:深入理解流水线技术引言在现代计算机架构中,流水线(Pipeline)是一种允许多个指令同时在处理阶段中前进的技术,极大地提高了处理器的效率和性能。在汇编语言层面理解流水线,对于编写高效代码至关重要。本文将深入探讨流水线的工作原理、优势、挑战以及......