设计模式——工厂方法模式

news2025/1/21 9:28:05

文章目录

  • 1. 工厂方法模式的定义
  • 2. 工厂方法模式的类图
  • 3. 工厂方法模式的作用
  • 4. 工厂方法模式的实现

1. 工厂方法模式的定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

2. 工厂方法模式的类图

在这里插入图片描述

3. 工厂方法模式的作用

可以将产品的“实现”从“使用中解耦”,如果增加产品或者改变产品的实现,Factory并不会受到影响。

简单工厂和工厂方法之间的差异,在于简单工厂把全部的的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。简单工厂的做法,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。

4. 工厂方法模式的实现

需求:需要开设不同风格的披萨店,生产不同类型的披萨。

/**
 * 抽象的披萨商店
 */
public abstract class PizzaStore {

    /**
     * 这个就是工厂方法模式中的工厂方法,所有子类必须实现,用来创建具体产品
     *
     * @param type 产品类型
     * @return Pizza
     */
    protected abstract Pizza createPizza(String type);

    /**
     * 可以对产品进行操作
     *
     * @param type 产品类型
     * @return Pizza
     */
    public final Pizza create(String type) {
        return createPizza(type);
    };
}
/**
 * 具体的披萨商店,中国风格披萨店,用来生产中国风格披萨
 */
public class ChinesePizzaStore extends PizzaStore{
    @Override
    protected Pizza createPizza(String type) {
        if ("cheese".equals(type)) {
            return new ChineseCheesePizza();
        } else {
            return null;
        }
    }
}
/**
 * 具体的披萨商店,美国风格披萨店,用来生产美国风格披萨
 */
public class AmericanPizzaStore extends PizzaStore{
    @Override
    protected Pizza createPizza(String type) {
        if ("cheese".equals(type)) {
            return new AmericanCheesePizza();
        } else {
            return null;
        }
    }
}
/**
 * 披萨,是个抽象的产品
 */
public interface Pizza {

}
/**
 * ChineseCheesePizza,一个具体的产品
 */
public class ChineseCheesePizza implements Pizza{
    public ChineseCheesePizza() {
        System.out.println("我是中国风格的CheesePizza");
    }
}
/**
 * AmericanCheesePizza,一个具体的产品
 */
public class AmericanCheesePizza implements Pizza{
    public AmericanCheesePizza() {
        System.out.println("我是美国风格的CheesePizza");
    }
}
/**
 * 集团老板,开设多家连锁披萨店
 */
public class Boss {
    public static void main(String[] args) {
        // 中国风味的披萨店
        ChinesePizzaStore chinesePizzaStore = new ChinesePizzaStore();
        // 美国风味的披萨店
        AmericanPizzaStore americanPizzaStore = new AmericanPizzaStore();

        // 中国风味的CheesePizza
        chinesePizzaStore.createPizza("cheese");

        // 美国风味的CheesePizza
        americanPizzaStore.createPizza("cheese");
    }
}

我是中国风格的CheesePizza
我是美国风格的CheesePizza

Process finished with exit code 0

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

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

相关文章

[教程]一文搞懂STM32使用DHT11采集温湿度

1、DHT11简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能8…

GO语言基础-08-内建函数-make()、new()

文章目录1. make1.1 概述1.2 示例(make切片)1.3 示例(make map)1.4 示例(make 通道)2. new2.1 概念2.2 示例(new 切片)2.3 示例(new和make对比)2.4 示例&…

Java基础算法每日5道详解(2)

83. Remove Duplicates from Sorted List 从排序列表中删除重复项 Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well. Example 1: Input: head [1,1,2] Output: [1,2]Exa…

20230109测试ToyBrick的RK3588开发板运行Buildroot的V20220811版本

20230109测试ToyBrick的RK3588开发板运行Buildroot的V20220811版本 2023/1/9 14:25 开发板:Toybrick的TB-RK3588X开发板 SDK:RK3588_LINUX_20220811\rk3588-linux-20220811.tar.gz_06 H:\BaiduNetdiskDownload\RK3588_LINUX_20220811 rk3588-linux-2022…

【SQLyog错误号码2058解决办法】

当你遇到下图这个错误时,是由于SQLyog在8.0以上版本采用了新的加密方式。 解决办法: win R打开 , 输入cmd,打开命令行窗口, 然后连接你的SQLyog版本的服务器, mysql -uroot -P3306 -p注意:…

【Kotlin】数字类型 ( 安全转换函数 | 浮点型转整型 )

文章目录一、安全转换函数二、浮点型转整型一、安全转换函数 在 Kotlin 中 , 将 字符串 String 类型 转为 数字类型 , 如果 字符串 代表的数字类型 与 要换转的 数字类型 不匹配 , 就会出异常 ; 如 : 执行如下代码 , 就会报异常 ; 字符串内容是 0.5 , 显然是一个 Double 类…

Kotlin Flow响应式编程,StateFlow和SharedFlow

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。 大家好,今天是Kotlin Flow响应式编程三部曲的最后一篇。 其实回想一下我写这个Kotlin Flow三部曲的初衷,主要还是因为…

基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)

基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)名词定义视频格式sensor与ispI2CXCLK行场同步信号DATA抓图名词定义 CIF,指RK芯片中的VIP模块,用以接收Sensor数据并保存到Memory中,仅转存数据&#xff0c…

Komo 综合资产收集和漏洞扫描工具

前言 因工作中的需要,开发了这款综合资产收集和漏洞扫描工具,方便在工作中各方面的收集资产和漏洞扫描,同时也可用于挖洞。 Komo已经在工作中辅助我挖到过一些漏洞,同时轻便了我资产收集的过程。 Komo is a comprehensive asset c…

【图像处理OpenCV(C++版)】——3.3 几何变换之极坐标变换

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

MATLAB | 如何从热图中提取数据

这期做了个可能有用的小工具,一般论文中热图很少给出数据,于是就想写个小工具通过热图上的颜色估计出数据值来,目前写了个初版的工具分享给大家! 工具函数 由于只是初版,要手动改的地方还是不少的,要设置…

PHP多商户AI智能在线客服系统源码 机器人自动回复 即时通讯聊天系统源码

一套智能在线客服系统源码 多商户网页客服系统源码 支持二十种国际语言 带机器人自动回复。 框架:Thinkphp5workerman, 环境:nginxphp7.3mysql5.6 支持H5公众号APP小程序 了解更多可私信我! 系统功能: 1、支持国际…

编写程序时调用第三方程序时使用的是相对路径而不是绝对路径会造成什么严重后果(Windows Linux)

简介 在编写程序时,有很多人调用第三方程序使用的是相对路径,而不是绝对路径,如下: #!/bin/python3import osos.system("whoami") #调用whoami程序,查看当前用户名#!/bin/bashfind / -name "hellowor…

day10|239. 滑动窗口最大值、347.前 K 个高频元素

239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 示例 1: 输入:nums [1,3…

如何修改视频MD5的格式?这些方法值得你收藏

MD5实际上是计算机安全领域中广泛使用的一种散列函数,可以用来保护消息的完整性,简单来说就是类似于我们的指纹,可以说MD5是每个文件的“数字指纹”。比如:我们在平台上传一些热门视频,平台会自动识别视频的MD5值&…

嵌入式 LINUX 驱动开发 day01 第一个内核模块程序 多文件编译为一个程序, 内核模块参数, 内核模块依赖

1.第一个内核模块程序 ( 记得配置自己的交叉编译的工具,) 首先两个文件 vser.c Makefile (记得大写的M) vser.c #include <linux/init.h> //内核初始化头文件 #include <linux/module.h> //内核模块文件 #include <linux/kernel.h> //&…

Java基础算法每日5道详解(6)

112. Path Sum 路径总和 Given the root of a binary tree and an integer targetSum, return true if the tree has a root-to-leaf path such that adding up all the values along the path equals targetSum. A leaf is a node with no children. Example 1: Input: ro…

html+css实现一个响应式管理平台架构模板

文本将会带你使用htmlcss实现一个响应式的管理平台架构模板&#xff0c;目前来说市面上的管理平台架构模板大同小异&#xff0c;文本的知识点都会符合场景所需。 目录 1、管理平台的架构内容 2、顶部的布局 3、下半部分布局 4、左侧菜单区域实现 5、右侧主体区域实现 …

前端重新部署如何通知用户刷新网页?

我把我掘金的文章同步一份给CSDN 1.目标场景 有时候上完线&#xff0c;用户还停留在老的页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时候有时候js连接hash变了导致报错跳不过去&#xff0c;并且用户体验不到新功能。 2.思考解决方案 如何去解决这个问…

顶象助力绿球金科打造App低碳出行场景

“低碳出行”、“碳中和”、“碳惠普”正在成为近几年的科技热词之一。 自2020年9月&#xff0c;中国向世界许下“力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和”的承诺以来&#xff0c;一场围绕绿色节能、低碳减排的变革正在席卷各行各业。 “碳中和”已经成为时代…