Gof23设计模式之简单工厂/静态工厂模式

news2024/11/23 9:03:35

在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。

简单工厂模式/静态工厂模式其实不是一种设计模式,而算是一种编程思想。

以下讲解使用咖啡厅点咖啡来说明。

1.简单工厂模式

1.1.结构

简单工厂包含以下角色:

  • 抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品 :实现或者继承抽象产品的子类
  • 具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。

1.2.类图

在这里插入图片描述
解释:CoffeeStore类依赖于SimpleCoffeeFactory,SimpleCoffeeFactory依赖于抽象类Coffee,AmericanCoffee类和LatteCoffee类继承了Coffee类。

1.3.实现

抽象Coffee类


/**
 * @author 晓风残月Lx
 * @date 2023/6/18 21:58
 *      抽象咖啡
 */
public abstract class Coffee {

    public abstract String getName();

    // 加糖
    public void addSugar() {
        System.out.println("加糖");
    }

    // 加奶
    public void addMilk() {
        System.out.println("加奶");
    }

}

拿铁咖啡LatteCoffee类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:01
 *       拿铁咖啡
 */
public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

美式咖啡AmericanCoffee类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:01
 *      美式咖啡
 */
public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

简单咖啡工厂SimpleCoffeeFactory 类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:17
 *      简单咖啡工厂类,用来生产咖啡
 */
public class SimpleCoffeeFactory {

    public Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("american".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("latte".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("对不起,您点的咖啡没有");
        }
        return coffee;
    }
}

咖啡店CoffeeStore类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:02
 *      咖啡店
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type) {

        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();

        Coffee coffee = factory.createCoffee(type);

        // 加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }

}

测试类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:
 *      测试类
 */
public class Client {

    public static void main(String[] args) {
        // 1.创建咖啡店类
        CoffeeStore coffeeStore = new CoffeeStore();
        Coffee latteCoffee = coffeeStore.orderCoffee("latte");

        System.out.println(latteCoffee.getName());
     
    }
}

在这里插入图片描述

1.4.优缺点

优点:
封装了创建对象的过程,可以通过调用方法直接获取对象。把对象的创建和业务逻辑层分开,避免了修改客户代码。如果要实现新产品直接修改工厂类,而不需要在咖啡店CoffeeStore类中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点:
增加新产品时还是需要修改工厂类的代码,违背了开闭原则。

2.静态工厂模式

静态工厂模式与简单工厂模式一致,只是在工厂类中的创建对象的功能定位为静态的。

2.1.实现

工厂类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:17
 *      静态咖啡工厂类,用来生产咖啡
 */
public class StaticCoffeeFactory {

    // 在方法上加个static(与简单工厂相比)
    public static Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("american".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("latte".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("对不起,您点的咖啡没有");
        }
        return coffee;
    }
}

咖啡店CoffeeStore类

/**
 * @author 晓风残月Lx
 * @date 2023/6/18 22:02
 *      咖啡店
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type) {

        // 好处就是直接的调用方法
        Coffee coffee = StaticCoffeeFactory.createCoffee(type);

        // 加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }

}

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

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

相关文章

工地临边防护缺失识别检测算法 opencv

工地临边防护缺失识别检测系统通过opencvpython网络模型技术,工地临边防护缺失识别检测算法检测到没有按照要求放置临边防护设备时,将自动发出警报提示现场管理人员及时采取措施。Python是一门解释性脚本语言,是在运行的时候将程序翻译成机器…

PaddleOCR #使用PaddleOCR进行光学字符识别 - OCR飞桨实验

引言: PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文…

SPI(Serial Perripheral Interface)

SPI全称是Serial Perripheral Interface,也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线,SPI时钟频率相比I2C要高很多,最高可以工作在上百MHz。SPI以主从方式工作&#…

Fiddler抓包工具之Fiddler+willow插件应用

安装 Fiddler的安装包地址:fillderwillow 解压后安装fiddler4和willow1.4.*版本。 安装成功后,启动fiddler后会出现willow插件按钮: 说明安装成功。 重定向 willow重定向 进入willow界面后,通过右键->Add Project ->Add R…

Compose 嵌套滑动冲突的解决办法

前言 在最近我利用业余时间使用 Compose 写的 Gihub APP 中,它的首页结构是这样的: 采用了 Drawer 嵌套 Pager 的结构。 这就会出现一个问题,那就是 Drawer 和 Pager 都需要监听横向滑动手势,从而实现展开 Drawer 和 切换 Pager…

C#TryCatch用法

前几天一个学员在学习C#与TryCatch用法时,也不知道TryCatch用法装可以用来做什么 。下面我们就详细讲讲C# 和封TryCatch用法相关知识。 C# 是一种通用、类型安全且面向对象的编程语言,由微软开发并在 .NET 平台上运行。TryCatch 是 C# 语言中的一个结构&#xff0c…

PYTHON在数据保存csv时文件内容乱码了怎么解决?

目录标题 前言问题1. 在打开 CSV 文件时指定编码方式2. 将数据转换成 Unicode 编码尾语 前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 问题 如果你的 Python 程序采集到的数据在保存成 CSV 格式的文件时出现了乱码。 那么可尝试以下解决方法: 1. 在打…

MySQL数据库——索引、事务、存储引擎

MySQL 索引 索引的概念 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引…

一个项目的测试计划模板该怎么写?【附案例】

目录 一、引言 二、测试任务 三、测试进度 四、测试资源 五、测试策略 六、测试完成标准 七、风险和约束 八、问题严重程度描述和响应时间规范 九、测试的主要角色和职责 软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程,其目的在于检验…

Python进阶语法之异常处理

Python进阶语法之异常处理 在编写Python程序时,经常会遇到各种运行时错误,这些错误会导致程序终止并抛出异常。然而,有时我们希望程序能优雅地处理这些错误,而不是直接崩溃。在这种情况下,我们需要使用到Python的异常…

Vue中如何进行分布式存储与对象存储

Vue中如何进行分布式存储与对象存储 随着云计算和大数据时代的到来,分布式存储和对象存储越来越受到关注。在Vue中,我们可以使用不同的分布式存储和对象存储技术来存储和管理数据。本文将介绍Vue中如何进行分布式存储和对象存储。 什么是分布式存储&…

OpenGL 混合

1.简介 混合(Blending)通常是实现物体透明度的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。 2.丢弃片段 只想显示草纹理的某些部分&#xff0…

TDesign电商小程序模板解析01-自定义底部导航栏

目录 1 电商模板安装2 创建页面3 创建底部导航条总结 我们已经利用了两篇文章解读了一下微信小程序带的TDesign模板 TDesign小程序组件库01 TDesign小程序组件库02 入门一款前端组件库,如果挨个去看每个组件的用法未免比较枯燥,即使看懂了其实离实际开发…

从零开始 Spring Boot 44:Test

从零开始 Spring Boot 44&#xff1a;Test 图源&#xff1a;简书 (jianshu.com) 本篇文章我们讨论如何在 Spring 项目中编写测试用例。 当前使用的是 Spring 6.0&#xff0c;默认集成 JUnit 5。 依赖 Spring Boot 的测试功能需要以下依赖&#xff1a; <dependency><…

数据中心机柜PDU应该怎么选?

数据中心是国家确定的“新基建”七大领域之一。数据中心在国民经济和社会发展中所起的作用越来越重要&#xff0c;数据中心已经成为了各行各业的关键基础设施&#xff0c;为经济转型升级提供了重要支撑。在庞杂的数据中心&#xff0c;服务器和交换器担负着传输数据的重要责任&a…

【论文阅读-人机交互】通过用户参与来缓解人工智能决策中的知识失衡问题

Title: Mitigating knowledge imbalance in AI-advised decision-making through collaborative user involvement From: International Journal of Human - Computer Studies Link: https://doi.org/10.1016/j.ijhcs.2022.102977 目录 1 绪论2 方法2.1 假设2.2. 实验任务及研究…

【单片机】STM32F103C8T6 最小系统板原理图

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器&#xff0c;由STMicroelectronics&#xff08;ST&#xff09;公司生产。它是STMicroelectronics的STM32系列微控制器中的一员&#xff0c;被广泛应用于嵌入式系统和电子设备中。 STM32F103C8T6单片机的主要特点和资源…

点云深度学习系列博客(七): 针对点云的数据增强技术

好长时间不更新博客了&#xff0c;入职以后突然就变忙了&#xff0c;确实有心无力。最近做一个点云数据增强的项目&#xff0c;搞了一个简单的前期调研&#xff0c;趁着最近几天不太忙&#xff0c;凑一篇博客出来&#xff0c;保一下博客专家资格... 一. 简介 我们在利用深度学…

TDesign电商小程序模板解析02-首页功能

目录 1 home.json2 goods-list组件3 goods-card组件总结 上一篇我们搭建了底部的导航条&#xff0c;这一篇来拆解一下首页的功能。首页有如下功能 可以进行搜索显示轮播图横向可拖动的页签图文卡片列表 1 home.json 因为是要使用组件库的组件搭建页面&#xff0c;自然是先需要…

Git第二章、多人协作

一、多人协作一 目前&#xff0c;我们所完成的工作如下&#xff1a; • 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等 • 申请码云账号&#xff0c;将远端信息clone到本地&#xff0c;以及推…