简单工厂模式详解

news2024/11/20 1:47:13

文章目录

  • 前言
  • 一、简单工厂模式定义
  • 二、举个例子
  • 三、简单工厂模式的缺点
  • 总结


前言

本篇我们了解一下简单工厂模式,它是设计模式的雏形,是学习设计模式的开端,我会结合案例说明它的设计思路。


一、简单工厂模式定义

简单工厂模式并不是GoF23个设计模式中的一员,但是一般将它作为学习设计模式的起点。简单工厂模式又称为静态方法模式(Static Factory Method Pattern),属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同的类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,这个类称为工厂类,被创建的实例通常都具有共同的父类。简单工厂模式的结构如下图:
在这里插入图片描述
在模式结构图中,Factory表示工厂类,它是整个模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外部直接调用,创建所需的产品对象。工厂类中有一个负责生产对象的静态工厂方法,系统可以根据工厂方法所传入的参数,动态决定应该创建出哪一个产品类的实例。工厂方法是静态的,而且必须有返回类型,其返回类型为抽象产品类型,即Product类型;Product表示抽象产品角色,它是简单工厂模式所创建的所有对象的父类,负责定义所有实例所共有的公共接口;ConcreteProduct表示具体产品角色,它是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。一个系统中一般存在多个ConcreteProduct类,每种具体产品对应一个Concrete类。

二、举个例子

我们设计一个Coffee(咖啡类),它是一个抽象类,比如现在有两种具体咖啡,分别是AmericanCoffee(美式咖啡)和LatteeCoffee(拿铁咖啡),因此我们需要一个具体工厂去创建具体咖啡产品,我们再定义一个生产咖啡的工厂SimpleCoffeeFactory,它们的模式结构图如下:
在这里插入图片描述
AmericanCoffee和LatteeCoffee需要继承Coffee这个抽象产品,同时都要实现Coffee中的抽象方法,比如获取咖啡名称,添加牛奶,加糖等方法,而SimpleCoffeeFactory是生产咖啡的工厂,需要提供一个静态的创建咖啡的方法,同时这个方法的返回值类型必须是Coffee抽象类,这就体现了多态的特性,即父类引用可以指向子类对象。
相关代码如下:
抽象咖啡类,其实也可以是接口,我定义的是抽象类:

abstract public class Coffee {

    abstract protected void getName();

    abstract protected void addMilk();

    abstract protected void addSugar();
}

美式咖啡(具体产品):

public class AmericanCoffee extends Coffee{

    @Override
    protected void getName() {
        System.out.println("American Coffee...");
    }

    @Override
    protected void addMilk() {
        System.out.println("add American coffee milk...");
    }

    @Override
    protected void addSugar() {
        System.out.println("add American coffee sugar...");
    }
}

拿铁咖啡(具体产品):

public class LatteCoffee extends Coffee{


    @Override
    protected void getName() {
        System.out.println("Latte Coffee...");
    }

    @Override
    protected void addMilk() {
        System.out.println("add Latte Coffee milk...");
    }

    @Override
    protected void addSugar() {
        System.out.println("add Latte Coffee sugar...");
    }
}

咖啡工厂类:

public class SimpleCoffeeFactory {

    public static Coffee createFactory(String type){
        Coffee coffee = null;
        if ("AmericanCoffee".equals(type)){
            coffee = new AmericanCoffee();
        } else if ("LatteeCoffee".equals(type)) {
            coffee = new LatteCoffee();
        }
        return coffee;
    }
}

在咖啡工厂类中定义了一个创建咖啡的静态方法,入参是咖啡的类型,根据类型判断返回具体咖啡对象。
在外部可以创建一个咖啡店类,调用工厂提供的静态方法去创建具体的咖啡:

public class CoffeeStory {

    public static void main(String[] args) {
        orderCoffee("AmericanCoffee");
    }

    public static Coffee orderCoffee(String name){
        SimpleCoffeeFactory simpleCoffeeFactory = new SimpleCoffeeFactory();
        Coffee coffee = simpleCoffeeFactory.createFactory(name);
        coffee.getName();
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

三、简单工厂模式的缺点

在简单工厂模式中,工厂类包含必要的判断逻辑,决定在什么时候创建哪一个产品类的实例,客户端可以直接免除直接创建产品对象的责任,而仅仅“消费”产品,简单工厂模式通过这种方式实现了对责任的划分。但是由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响;同时系统扩展较为困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则。比如上面的案例,如果我们再增加一种意大利咖啡,那么在创建具体产品类的同时,静态工厂方法的代码逻辑需要改动。因此,简单工厂模式是存在很多问题的,通常并不用于实际开发中。


总结

本篇我们结合实际案例说明了简单工厂模式的设计原理,和它包含的角色,下面我们继续看另一种设计更合理的工厂方法模式。

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

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

相关文章

JSX的基础使用

1. JSX嵌入变量作为子元素的使用 ①当变量是Number、String、Array类型时,可以直接显示; ②当变量是null、undefined、Boolean类型时,内容为空; 若想要展示nul、undefined、Boolean类型,转字符串;转换方式…

堆--二叉树的特有形式

目录 前言1.二叉树的顺序结构及实现1.1二叉树的顺序结构1.2堆的概念及结构 2.堆的功能函数的实现2.1堆结构体的定义2.2堆的初始化2.3堆的插入2.4 获取堆是否为空、堆大小、堆顶元素的函数2.5堆的销毁2.6对利用堆结构数组的数据建堆2.7堆的删除堆结构的源码 3.堆排序建堆的时间复…

2核4G服务器能安装多少个网站?亲测

2核4G服务器能安装多少个网站?2核4g配置能承载多少个网站?一台2核4G服务器可以安装多少个网站?阿腾云2核4G5M带宽服务器目前安装了14个网站,从技术角度是没有限制的,只要云服务器性能够用,想安装几个网站就…

AE关键帧

关键帧 根据上次说到的五大变换,找准起始时间点和起始动作再去找结束时间点和结束动作,其中包括可使用贝塞尔曲线对锚点进行拖拽,使其完成曲线运动 快捷键 n删除右侧,b删除左侧,ctrlshiftd裁剪,ctrld复制…

我记忆中的电脑城

目录 一、我记忆中的电脑城 二、电脑城衰退 三、拥抱趋势 在过去很长一段时间里,想要购买电子设备都逃不开一个叫“电脑城”的地方,那里鱼龙混杂良莠不齐,是令许多人记忆深刻分外难忘之处。 一、我记忆中的电脑城 想起上一次去电脑城&…

ylb-接口11实名认证

总览: 在web模块config包下,创建实名认证的一个配置类JdwxRealnameConfig: package com.bjpowernode.front.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype…

【NI USRP】 USRP 硬件资源和性能是怎么样的呢?是如何构成的呢

B系列 型号频段最大带宽通道FPGAADI 芯片B200mini70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX150AD9364B200mini-i70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX75AD9364B205mini-i70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX75AD9364B20070 MHZ - 6 GHZ56 MHz1X…

AN OVERVIEW OF LANGUAGE MODELS RECENT DEVELOPMENTS AND OUTLOOK

LLM系列相关文章,针对《AN OVERVIEW OF LANGUAGE MODELS: RECENT DEVELOPMENTS AND OUTLOOK》的翻译。 语言模型综述:近年来的发展与展望 摘要1 引言2 语言模型的类型2.1 结构化LM2.2 双向LM2.3 置换LM 3 语言单元3.1 字符3.2 单词和子单词3.2.1 基于统…

Java正则表达式捕获组

捕获组是将多个字符视为一个单元的一种方法。 它们是通过将要分组的字符放在一组括号中来创建的。 例如,正则表达式(dog)创建包含字母d,o和g的单个组。 捕获组通过从左到右计算它们的左括号来编号。 在表达式((A)(B(C)))中,例如,…

Xline 源码解读(一) —— 初识 CURP 协议

01、Xline是什么 Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。 02…

GAMES101 OpenCV环境安装

文章目录 Opencv 库编译Step 1.下载源码Step 2. 使用CMake编译Step3. 解决CMake 过程中的报错错误1: 错误的Python版本:错误1 解决办法 错误2:下载ippicv_2020_win_ia32_20191018_general.zip失败错误2 解决办法 错误3:ffmpeg相关文件下载失败…

ROS学习笔记(0):几个重要概念:节点、消息、主题、服务

1、节点(node) 节点是进行运算任务的进程。一个系统可以由很多节点组成,节点也可以称为软件模块。 ROS是以节点的形式开发的,节点是根据其目的,可以细分的可执行程序的最小单位。 主节点 由于机器人的元器件很多&…

win10查看、关闭和开启多个mysql服务

我的之前安装了2个MySQL版本,一个是MySQL8.0.17,一个是MySQL5.7.19 为什么要查看怎么关闭MySQL服务?如果是个人电脑,我觉得开启一个服务相当于开启一个进程,可能会占用部分内存。如果自己是游戏摆烂状态(非学习状态&…

R语言forestploter包优雅的绘制孟德尔随机化研究森林图

在既往文章中,我们对孟德尔随机化研究做了一个简单的介绍。我们可以发现,使用TwoSampleMR包做出来的森林图并不是很美观。今天我们使用R语言forestploter包优雅的绘制孟德尔随机化研究森林图。 使用TwoSampleMR包做出来的森林图是这样的 而很多SCI文章…

qt和vue的交互

1、首先在vue项目中引入qwebchannel /******************************************************************************** Copyright (C) 2016 The Qt Company Ltd.** Copyright (C) 2016 Klarlvdalens Datakonsult AB, a KDAB Group company, infokdab.com, author Milian …

简易评分系统

目录 一、实验目的 二、操作环境 三、实验内容和过程 1.实验内容 2.代码 2.1 用户验证功能 2.2 菜单函数 2.3 评分功能 四、结果分析 总体的输出结果: 保存文件成功截图: 五、小结 一、实验目的 1.巩固和提高学生学过的基础理论和专业知识&am…

windows下安装consul、springboot整合consul

Spring Cloud Consul通过自动配置和绑定到Spring Environment和其他Spring编程模型习语,为Spring Boot应用程序提供Consul集成。通过一些简单的注解,可以快速启用和配置应用程序内的常用模式,并使用Hashicorp的Consul构建大型分布式系统。提供…

使用Dreambooth LoRA微调SDXL 0.9

本文将介绍如何通过LoRA对Stable Diffusion XL 0.9进行Dreambooth微调。DreamBooth是一种仅使用几张图像(大约3-5张)来个性化文本到图像模型的方法。 本教程基于通过LoRA进行Unet微调,而不是进行全部的训练。LoRA是在LoRA: Low-Rank Adaptation of Large Language …

如何通过CRM系统减低客户流失率并提高销售业绩?

销售人员如何提高业绩,减低客户流失率?通过CRM客户管理系统与客户建立良好的客户关系、提升客户体验助力销售人员业绩节节攀升,降低客户流失率。接下来我们就来说一说CRM系统如何实现的? 1.全渠道沟通提升客户体验 只有足够多的…

搜索结果处理

1、排序 #sort排序 GET /hotel/_search {"query": {"match_all": {}},"sort": [{"score": "desc"},{"price": "asc"}] }#找到121.6,31周围的酒店,距离升序排序 GET /hotel/_sea…