工厂模式和策略模式的区别和各自的实现

news2024/9/20 14:43:11

工厂模式和策略模式是两种不同的设计模式,它们分别解决的是创建对象和定义算法家族的问题。

工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。
工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。

应用实例

  • 汽车制造:你需要一辆汽车,只需从工厂提货,而不需要关心汽车的制造过程及其内部实现。
  • Hibernate:更换数据库时,只需更改方言(Dialect)和数据库驱动(Driver),即可实现对不同数据库的切换。

实现

我们将创建一个 Car接口和实现 Car 接口的实体类。然后定义工厂类 CarFactory。

  1. Car接口
public interface Car {
    void run();
}

  1. 三个不同的Car实现类
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AudiCar implements Car {
    @Override
    public void run() {
      log.info("奥迪,启动!");
    }
}
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class BmwCar implements Car {
    @Override
    public void run() {
      log.info("宝马,启动!");
    }
}
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class BydCar implements Car {
    @Override
    public void run() {
      log.info("比亚迪,启动!");
    }
}
  1. CarFactory

我们通过CarFactory的getCar方法来获取 Car 对象,然后通过统一的run方法来执行操作

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class CarFactory {
    /**
     * 这里通过getCar获取不同的汽车对象
     * @param name
     * @return
     */
    public Car getCar(String name) {
        if (StrUtil.isNotBlank(name)) {
            switch (name) {
                case "比亚迪":
                    return new BydCar();
                case "宝马":
                    return new BmwCar();
                case "奥迪":
                    return new AudiCar();
            }
        }
        throw new RuntimeException("类型获取失败!!");
    }
 
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Car car = carFactory.getCar("比亚迪");
        car.run();
        Car car2 = carFactory.getCar("宝马");
        car2.run();
        Car car3 = carFactory.getCar("奥迪");
        car3.run();
        Car car4 = carFactory.getCar("问界");
        car4.run();
    }
}

  1. 输出结果
    在这里插入图片描述

策略模式

在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。

应用实例

  • 锦囊妙计:每个锦囊代表一个策略,包含不同的计策。
  • 旅行方式选择:骑自行车、坐汽车等,每种方式都是一个可替换的策略。
  • 消息通知:不同的消息通知,有不同的处理

实现

  1. 消息类和初始化类
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Message {
    private String content;
    private String type;
}

import java.util.ArrayList;
import java.util.List;


public class MessageBuilder {
     public static List<Message> createTestMsg() {
         List<Message> msgList = new ArrayList<Message>();
         msgList.add(new Message("email消息通知测试","email"));
         msgList.add(new Message("微信消息通知测试","wechat"));
         msgList.add(new Message("QQ消息通知测试","qq"));
         msgList.add(new Message("短信消息通知测试","msg"));
         return msgList;
     }
}

  1. 消息策略接口和实现类
public interface MessageStrategy {

    void handleMsg(Message msg);
}

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class EmailStrategy implements MessageStrategy{
    @Override
    public void handleMsg(Message msg) {
        log.info("收到email消息通知,正在解析内容:{}", msg.getContent());
        log.info("执行email业务逻辑开始");
    }
}


import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MsgStrategy implements MessageStrategy{
    @Override
    public void handleMsg(Message msg) {
        log.info("收到msg消息通知,正在解析内容:{}", msg.getContent());
        log.info("执行msg业务逻辑开始");
    }
}

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class QQStrategy implements MessageStrategy{
    @Override
    public void handleMsg(Message msg) {
        log.info("收到qq消息通知,正在解析内容:{}", msg.getContent());
        log.info("执行qq业务逻辑开始");
    }
}

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WechatStrategy implements MessageStrategy{
    @Override
    public void handleMsg(Message msg) {
        log.info("收到wechat消息通知,正在解析内容:{}", msg.getContent());
        log.info("执行wechat业务逻辑开始");
    }
}

  1. 消息上下文对象和消息工厂

public class MessageContext {
    private MessageStrategy messageStrategy;

    public void setMessageStrategy(MessageStrategy messageStrategy) {
        this.messageStrategy = messageStrategy;
    }

    public void handleMessage(Message message) {
        if (message != null) {
            messageStrategy.handleMsg(message);
        }
    }
}

import java.util.HashMap;
import java.util.Map;

public class MessageFactory {

    private  static Map<String, MessageStrategy> map = new HashMap<>();


    public static void init() {
        map.put("qq", new QQStrategy());
        map.put("email", new EmailStrategy());
        map.put("msg", new MsgStrategy());
        map.put("wechat", new WechatStrategy());
    }
    
    public static MessageStrategy getMessageStrategy(String type){
        return map.get(type);
    }
}
  1. 执行的客户端类
import java.util.List;

public class StrategyClient {
    public static void main(String[] args) {
        List<Message> messages = MessageBuilder.createTestMsg();
        MessageContext context = new MessageContext();
        MessageFactory.init();
        messages.forEach(temp -> {
            MessageStrategy factory = MessageFactory.getMessageStrategy(temp.getType());
            context.setMessageStrategy(factory);
            context.handleMessage(temp);
        });
    }
}
  1. 执行结果
    在这里插入图片描述

区别总结

  • 应用场景:
    工厂模式:用于创建对象,特别是当对象创建的逻辑很复杂或者需要根据条件创建不同类型的对象时。
    策略模式:用于处理算法的选择和切换,特别是当这些算法是互斥的且可以在运行时改变时。

  • 关注点:

  1. 工厂模式关注的是“如何创建对象”,强调的是创建过程的封装。
  2. 策略模式关注的是“如何使用算法”,强调的是算法的可替换性和独立性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何发布年会通知?

在组织年会等重要活动时&#xff0c;确保每位参与者都能及时接收到通知至关重要。本文将指导您如何利用云分组平台发布年会通知&#xff0c;并通过查询功能为参与者提供座位号等信息。一、电脑端上传查询信息 1. 登录云分组官网 访问官网并通过微信扫码登录。2. 进入查询菜单 在…

通过因子分析识别消费者偏好的潜在因素的案例

因子分析是一种统计方法&#xff0c;用于研究变量之间的潜在关系。它是一种降维技术&#xff0c;通过识别较少数量的因子&#xff08;或称为维度、成分&#xff09;来解释多个观测变量之间的相关性。这些因子是不可观测的潜在变量&#xff0c;它们被认为是原始变量的潜在原因。…

厦门凯酷全科技有限公司抖音小店的新蓝海开启电商新篇章

在数字经济的浪潮中&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正以前所未有的速度改变着我们的消费方式和商业模式。作为这股浪潮中的佼佼者&#xff0c;厦门凯酷全科技有限公司凭借其敏锐的市场洞察力和前瞻性的战略布局&#xff0c;成功在抖音小店这一新兴平…

乐凡北斗卫星通信终端,多场景应用

北斗卫星通信终端在民生保障、抗险减灾、野外搜救、海洋渔业、交通运输、边境巡防等多个领域都有广阔的应用空间。在不同场景下&#xff0c;乐凡北斗卫星通信终端发挥着各自独特而关键的作用&#xff0c;其强大的定位功能和北斗三代短报文功能保障了信息的高效传递和任务的顺利…

Context-dependence:Why your environment matters(情境依赖:为什么环境很重要)

Consider an everyday situation:You get up from your desk to have a cup of tea.Once you arrive in the kitchen, you forget what you wanted.However, when you get back to your desk, you suddenly remember. 考虑一个日常会遇到的情况:你从桌旁起身想要倒杯茶&#xf…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化&#xff1a;计算机加电后进行硬件检测。加载引导程序&#xff0c;将Linux内核加载到内存中。 内核初始化&#xff1a;内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Chat App 项目之解析(四)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

Nature Communications | 全球草地土壤碳储量随植物多样性的增加而增加

在许多生态系统中物多样性与土壤有机碳(SOC)储量呈正相关。最可能的原因是植物多样性积极影响植物生产力&#xff0c;从而影响土壤的有机碳输入量。大多数关于植物多样性对植物生产力和有机碳储量影响的证据都是基于控制植物物种丰富度的小规模实验。然而&#xff0c;那些短期的…

Flink入门(五)--Flink算子

Map DataStream → DataStream 一个接受一个元素并产生一个元素的函数。 示例 dataStream.map { x > x * 2 } FlatMap DataStream → DataStream 一个接受一个元素并产生零个、一个或多个元素的函数。 例如 dataStream.flatMap { str > str.split(" ") }…

把直播间搬到工厂,淘宝直播打造卖爆新路径

又一年中秋将至&#xff0c;电商平台们再度开启了月饼生意。 8月21日&#xff0c;杭州&#xff0c;淘宝直播的主播们组成“白月光”队和“黑月牙”队&#xff0c;下工厂&#xff0c;探访体验馆&#xff0c;开始了一场“寻月之旅”。“我们米月饼的饼皮是根据南宋糕点改良而来”…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

【CSP:202212-2】训练计划(Java)

题目链接 202212-2 训练计划 题目描述 求解思路 模拟&#xff1a; over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号&#xff08;每个项目最多有一个依赖项目&#xff09;days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖…

面向对象09:instanceof和类型转换

‌ 本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 instanceof是Java中的一个二元运算符&…

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&a…

MATLAB 沿任意方向分层点云(82)

MATLAB 沿任意方向分层点云(82) 一、算法介绍二、算法实现1.代码2.效果更多内容参考: MATLAB点云处理学习 一、算法介绍 沿着某个方向,将点云分割为多层,每层点云使用不同颜色进行可视化显示,具体代码和不同方向的分层效果如下: 二、算法实现 1.代码 % Load point c…

学生信息管理系统的设计与实现(包含文档、源码、sql脚本、导入视频教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生信息管理系统拥有三种角色&#xff0c;分别为学生、教师和管理员&#xff0c;功能更加完善&#xff0c;可以作为初学者参照学习课程设计。 学生&#xff1a;班级通讯录查询、个人信息…

一键生成PPT只需这一步!AI先行者全面指南

在当今快节奏的工作生活中&#xff0c;我们需要不断地准备各种报告和演示文稿。传统的PPT制作方式往往耗费大量时间和精力&#xff0c;而AI先行者的出现改变了这一切。这款强大的智能工具能够帮助您快速生成高质量的PPT&#xff0c;提高工作效率。今天&#xff0c;我们将为您带…

CLASS1:文献管理软件使用

1 文献查阅 引新(3年内)不引旧引用经典2 文献检索网站汇总 Web of Science(论文中了之后下载证明) Author Search - Web of Science Core Collection (clarivate.cn) X-MOL(查阅文献) X-MOL学术平台 计算机, 热门类期刊, - X-MOL Scidown(下载原文) Sci论文期刊检索|

zabbix监控进程、日志、主从(状态、延迟)

环境&#xff1a;rocky Linux9虚拟机四台&#xff0c;zabbix端为服务端&#xff0c;node6为客户端&#xff0c;node4为mariadb主&#xff0c;node7为mariadb从 一、zabbix监控进程 以httpd服务为例 1、客户端安装httpd [rootnode6 ~]# yum -y install httpd [rootnode6 ~]#…

微服务Gateway服务⽹关

一、Gateway服务⽹关 1.1为什么需要⽹关 Gateway⽹关是我们服务的守⻔神&#xff0c;所有微服务的统⼀⼊⼝。 ⽹关的核⼼功能特性&#xff1a; 请求路由和负载均衡&#xff1a;⼀切请求都必须先经过gateway&#xff0c;但⽹关不处理业务&#xff0c;⽽是根据某种规则&…