工厂方法模式详解

news2024/9/22 17:25:18

文章目录

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


前言

工厂方法模式是应用比较广泛的一种设计模式,它相对于简单工厂模式进行了一些优化,如果再增加一个具体产品不用修改代码,也不会违反开闭原则。


一、工厂方法模式的定义

工厂方法模式也称为工厂模式,又称为虚拟构造器(Virtual Constructor)模式或多态模式,属于类创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类,工厂方法模式结构图如下图所示:
在这里插入图片描述
在模式结构图中,Product表示抽象产品,它定义了产品的接口;ConcreteProduct表示具体产品,它实现抽象产品的接口;Factory表示抽象工厂,它声明了工厂方法(FactoryMethod),返回一个产品;ConcreteFactory表示具体工厂,它实现工厂方法,由客户端调用,返回一个产品实例。在工厂方法模式中,工厂方法模式的核心是抽象工厂类Factory,各种具体工厂类继承抽象工厂类并实现在抽象工厂类中定义的工厂方法,从而使得客户端只关心抽象产品和抽象工厂,完全不用理会返回的是哪一种具体产品,也不用关系它是如何被具体工厂创建的。

二、举个例子

定义一个Coffee类,它是抽象产品,还有一个CoffeeFactory它是抽像工厂,还有一个具体产品AmericanCoffee继承Coffee类,同时要有一个AmericanCoffeeFactory它要继承CoffeeFactory,另外还有一个LatteeCoffee它也是具体产品需要继承Coffee,同时有一个具体工厂生产这种产品就是LatteeCoffeeFactory。它的模式结构图如下:
在这里插入图片描述
Coffee抽象类:

abstract public class Coffee {

    abstract protected void getName();

    abstract protected void addMilk();

    abstract protected void addSugar();
}

AmericanCoffee:

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...");
    }
}

LatteeCoffee:

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...");
    }
}

AmericanCoffeeFactory:

public class AmericanCoffeeFactory extends CoffeeFactory {

    @Override
    protected Coffee createCoffee() {
        return new AmericanCoffee();
    }
}

LatteeCoffeeFactory:

public class LatteeCoffeeFactory extends CoffeeFactory {

    @Override
    protected Coffee createCoffee() {
        return new LatteCoffee();
    }
}

客户端:

public class CoffeeStory {

    private static CoffeeFactory coffeeFactory;

    public static void main(String[] args) {
        CoffeeStory coffeeStory = new CoffeeStory(new AmericanCoffeeFactory());
        coffeeStory.orderCoffee();
    }

    public CoffeeStory(CoffeeFactory coffeeFactory){
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(){
        Coffee coffee = coffeeFactory.createCoffee();
        coffee.addMilk();
        coffee.getName();
        coffee.addSugar();
        return coffee;
    }
}

在客户端我们定义一个静态抽象工厂的引用类型,同时重载构造方法,形式参数就是抽象工厂类型,当客户端调用的时候,可以传入具体工厂类型,那么抽象工厂引用就会指向具体子类工厂,这也体现了多态的思想。

三、工厂方法模式的缺点

在系统中加入新产品时吗,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他具体工厂和具体产品,而只要添加一个具体工厂和具体产品即可,这样,系统的可扩展性也就变得非常好,符合开闭原则。但是在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,难免会增加系统类的个数,增加系统的开销。


总结

本篇就是对工厂方法模式进行的一个设计原理分析。

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

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

相关文章

Spring 6【什么是Spring 6、Spring框架介绍 、Spring IoC/DI 详解 】(一)-全面详解(学习总结---从入门到深化)

目录 一、Spring 6 二、Spring框架介绍 三、Spring IoC/DI 详解 一、Spring 6 1. 为什么要学习Spring 6 Spring 作为 Java程序员必会武功,无论是Spring的哪个版本,至少需要会一版本。再此基础上不会一套 组合拳SSM或SSH,出门都不好意思…

DAO(Data Access Object)

ProductDAO.java Search.java (Servlet) Compile Tomcat http://localhost:8080/book/chapter15/search.jsp Insert.java Compile http://localhost:8080/book/chapter15/insert.jsp

介绍用户协议报UDP

作者:爱塔居 专栏:计算机网络 文章目录 目录 文章目录 一、UDP概述 二、UDP的首部格式 一、UDP概述 用户数据报协议UDP只是在IP的数据报服务之上增加了很少一点的功能:复用和分用的功能以及差错检测的功能。 重点要记住UDP的主要特点&am…

JDK 下载 华为云镜像站 地址

通常去 Oracle 官网下载 JDK,速度很慢而且需要账号登入 Oracle 官网下载地址 https://www.oracle.com/cn/java/technologies/downloads/archive/ JDK 下载 华为云镜像站 地址 https://repo.huaweicloud.com/java/jdk/ 我们下期见,拜拜!

C++程序生成文件

文章目录 VS2019 Debug 模式VS2019 Release 模式exe连接动态库和静态库的流程 VS2019 Debug 模式 在Visual Studio的Debug模式下运行程序时,会生成以下文件: 可执行文件(.exe):生成的可执行文件(.exe&#…

深度学习常用激活函数总结

激活函数的特点 非线性。引入非线性能提升模型的表达能力可微分。如果激活函数不可微,那就无法使用梯度下降方法更新参数非饱和性。饱和指在某些区间上激活函数的梯度接近于零,使参数无法更新取值范围有界。这样可以使网络更稳定,即使有很大…

dede tag不以关键词作为url以数字作为url方法修改

dede tag不以关键词作为url以数字作为url方法修改 打开/include/taglib/tag.lib.php 查找以下代码: $row[link] $cfg_cmsurl."/tags.php?/".urlencode($row[keyword])."/"; 替换为: $row[link] $cfg_cmsurl."/tags.php?/&q…

RoPE旋转位置编码图形化理解

很多博文用公式描述RoPE的作用,看来看去还是似懂非懂,本文用图形的方式形象化的展示RoPE的作用; 首先,RoPE的核心思想是通过绝对位置编码的方式实现相对位置编码,本文主要围绕下图进行介绍; 假设一个序列…

第二章 Android 基础--开发基础

文章目录 1.使用真机调试运行2.Android开发涉及的编程语言3.工程目录结构4.编译配置文件 build.gradle5.清单文件6.界面显示与逻辑处理7.Activity创建与跳转8.练习题 本专栏主要在B站学习视频: B站Android视频链接 本视频范围:P9—P16 工程结构、设计规…

redis数据类型和数据结构你了解吗 学习总结篇!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 这期给大家讲一下关于 Redis 数据类型和数据结构的区别,很多读者包括笔者自己,早期也是傻傻分不清。备注:部分图片借鉴小林哥&…

计数排序

计数排序 排序步骤 1、以最大值和最小值的差值加一为长度创建一个新数组 2、将索引为0对应最小值,索引为1对应最小值1,索引为2对应最小值2,以此类推,将索引对应最小值到最大值之间所有的值 3、遍历一遍,遇到一个数字…

hcip第一天——复习静态路由习题

目录 1.绘制拓扑及划分网段 2.配置 1.lsw1 2.lsw2 3.R1 4.R2 5.R3 6.R4 7.R5 8.R6 9.部分pc 10.部分测试 要求 1.绘制拓扑及划分网段 2.配置 1.lsw1 2.lsw2 3.R1 4.R2 5.R3 6.R4 7.R5 8.R6 9.部分pc 10.部分测试

SpringBoot【原理分析、YAML文件、SpringBoot注册web组件】(二)-全面详解(学习总结---从入门到深化)

目录 SpringBoot原理分析_核心注解 YAML文件_配置文件介绍 YAML文件_自定义配置简单数据 YAML文件_自定义配置对象数据 YAML文件_自定义配置集合数据 YAML文件_读取配置文件的数据 使用ConfigurationProperties读取 YAML文件_占位符的使用 YAML文件_配置文件存放位置及优…

react+unittest+flask 接口自动化测试平台

目录 1 前言 2 框架 2-1 框架简介 2-2 框架介绍 2-3 框架结构 3 平台 3-1 平台组件图 1 新建用例 2 生成测试任务 3 执行并查看测试报告 3-2 用例管理 3-2-1 用例设计 3-3 任务管理 3-3-1 创建任务 3-3-2 执行任务 3-3-3 测试报告 3-3-4 邮件通知 1 前言 在现…

【电路原理学习笔记】第3章:欧姆定律:3.4 电阻的计算

第3章:欧姆定律 3.4 电阻的计算 电阻相关欧姆定律公式: R V I R\frac{V}{I} RIV​ 【例3-16】在图3-13所示的电路中,电阻为多少时,电池的电流才为3.08A? 【答】 R V I 12 V 3.08 A 3.90 Ω R\frac{V}{I}\frac{1…

AI大模型的现状与发展

AI大模型的现状与发展 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦!😄 ✨座右铭…

leetcode 108. 将有序数组转换为二叉搜索树

2023.7.16 由数组构造二叉搜索树地问题,本题可以借鉴从中序与后序遍历序列构造二叉树 这道题,这类题本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。 下面直接看代码: class Solution { public:Tree…

电子器件系列43:贴片led、发光二极管

干货!发光二极管的全面解读 二极管、发光二极管参数详解_sam-zy的博客-CSDN博客 对几个型号的贴片led进行参数解读: ols-330 特性: 带镜头,从PCB背面安装 视角40 贴片1206 尺寸:3.2(长)x1.6(宽)x1.9(高)mm …

明代元素时装小姐姐【InsCode Stable Diffusion美图活动一期】

一、 Stable Diffusion 模型在线使用地址:https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置: 模型:chilloutmix_NiPrunedFp32Fix Lora:hanfu_ming 采样迭代步数(steps): 40 采样…

故障排错篇之OSPF协议

一、OSPF邻居建立不成功 1、从理论上判断问题的所在 1.1、检查邻居两端的接口物理和协议状态是否UP,状态是否稳定,接口是否有丢包,两边互ping大包是否能通 若物理接口不Up或是不稳定(有振荡现象),请排查…