23种设计模式之工厂方法模式(黑马程序员)

news2024/9/21 22:52:23

工厂方法模式

    • 一、概述
    • 二、结构
    • 三、实现
    • 四、总结
    • 在最后

一、概述

定义一个用户创建对象的工厂(接口),让接口的子类决定去实例化哪个对象,依赖其抽象编程。即工厂方法使一个类的实例化延迟到其工厂的子类。

二、结构

工厂方法模式的主要角色

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂(ConcreFactory):主要实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性。
  • 具体产品(ConcreteProduct):实现了抽象产品决定定义的结偶,由具体工厂来创建,它同具体工厂之间一一对应。

三、实现

工厂方法类图如下:
类图
代码如下:
抽象工厂:

public interface CoffeeFactory {
    public Coffee create();
}

抽象产品:

public abstract class Coffee {
    public String name;
    //加奶
    public void addMilk(){
        System.out.println("加奶");
    }
    //加糖
    public void addSugar() {
        System.out.println("加糖");
    }
    public abstract String getName();
    public Coffee setName(String name) {
        this.name = name;
        return this;
    }
}

具体的两个工厂:

public class LatteCoffeeFactory implements CoffeeFactory {
    @Override
    public Coffee create() {
        return new LatteCoffee();
    }
}
public class AmericanCoffeeFactory implements CoffeeFactory{
    @Override
    public Coffee create() {
        return new AmericanCoffee();
    }
}

具体的两个产品:

public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}
public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

创建对象:

public class CoffeeStore {
    private CoffeeFactory factory;
    public CoffeeStore setFactory(CoffeeFactory factory) {
        this.factory = factory;
        return this;
    }
    // 点咖啡的功能
    public Coffee orderCoffee(){
        Coffee coffee = factory.create();
        //加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

四、总结

优点:

  • 前文中提到了,具体的产品和具体的工厂是一一对应的,所以用户只需知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创造过程。
  • 如果以后要在系统中添加新的产品时,只需添加具体的产品类和对应的具体工厂类,无需对原工厂进行修改,满足开闭原则。

缺点:

  • 每增加一个产品,就要增加一个具体的产品类和一个对应的具体工厂类,这增加了系统的复杂度。(如果系统中的产品类特别特别的多,就会缠上类爆照。。)

ps:
开闭原则:对修改关闭,对扩展开放。


在最后

❤️ 博主笔力尚浅,文中有疏漏之处还请流言指正,不胜感激。❤️ 谢谢大家。❤️

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

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

相关文章

计算机组成原理实验二 存储系统预习报告

实验一----静态RAM 一、实验目的 掌握静态随机存储器 RAM 工作特性及数据的读写方法。基于信号时序图,了解读写静态随机存储器的原理。 二、实验预习 1、阅读实验指导书,然后回答问题。 实验所用的静态存储器由一片 6116(2K*8bit &#x…

ROS开发之如何在同一个节点订阅、处理、发布消息?

文章目录0、引言1、创建中间特殊文件(含订阅者和发布者)2、在CMakeLists.txt添加编译规则3、在launch添加启动项4、编译运行5、三维显示0、引言 在ROS应用一般会用到发布者和订阅者,若只接收传感器数据,则只实现订阅者就行&#x…

客户服务 KPI是什么

当企业着手改进其客户服务计划时,必须以可衡量的方式进行。因为如果我们为了改进而改进,没有衡量,我们就永远无法真正知道我们做得有多好!如果您的公司已准备好升级其客户服务计划,这里有 12种方法可以衡量和跟踪您的客…

大学生问AI

大学生问AI写在最前面2,描述你在学习工作中碰到的最高级的 AI 是什么?1,你人生中第一次接触到 “人工智能” 的概念和产品是什么? 让你觉得 “人类做得东西的确有智能”?3,你听说过最近的 GPT,n…

Qt5.12實戰之Linux靜態庫與動態庫多文件生成a與so文件並調用

1.編輯並輸入內容到test.cpp與test2.cpp test.cpp #include <stdio.h> int func() {return 888; } test2.cpp #include <stdio.h> int func2() {return 999; } 將test.cpp與test2.cpp編譯成目標文件&#xff1a; g -c test.cpp test2.cpp 一次性生成目標文件…

阅读提升内在美

最近&#xff0c;想在内在美上提升自己&#xff0c;想把玩游戏的时间腾给阅读。不想只是善良&#xff0c;更希望自己拥有智慧拥有力量&#xff0c;更自信更热爱生活。 本篇博文会日日更新&#xff0c;也当作鼓励我继续阅读坚持阅读的动力和监督。 Z-Library 图书馆 分享一个…

LeetCode 1041. 困于环中的机器人

原题链接&#xff1a;1041. 困于环中的机器人 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; …

测试专家须精通Locust

目前随着AI人工智能越来越火&#xff0c;Python 编写的程序越来越多&#xff0c;更多的协议&#xff0c;更多的复杂应用。 所以Locust 是高级性能测试工程师和测试专家&#xff0c;必备技术之一&#xff0c;因为你不可能避免公司中使用python.编写接口或者程序。 在互联网公司…

C#|调用C/C++动态库

参考&#xff1a;C#总结&#xff08;四&#xff09;调用C动态库&#xff08;https://www.shuzhiduo.com/A/A2dmV49qze/&#xff09; 文章目录C#加载C动态库C#加载C#动态库涉及到的概念知识&#xff1a;托管DLL和非托管DLL的区别&#xff08;https://www.tinymind.net.cn/articl…

利用 ELK 处理 Percona 审计日志

Percona Server为 MySQL 数据库服务器进行了改进&#xff0c;在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具&#xff1b;另外有更多的参数和命令来控制服务器行为 前提 1、有强烈的审计需求。…

网站建设常用的cms建站系统推荐

国内网站建设市场参差不齐&#xff0c;建站公司多如牛毛&#xff0c;网站价格便宜的几百&#xff0c;贵的几十万&#xff0c;作为外行&#xff0c;很难去选择&#xff0c;国内大部分网站建设公司都是营销公司&#xff0c;完全没有底层技术框架的开发能力&#xff0c;90%以上的网…

srs流媒体服务安装和使用

简介 SRS(Simple Realtime Server)是一个简单高效的实时视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多种实时流媒体协议。 官网&#xff1a;https://ossrs.net/lts/zh-cn/ 编译安装 使用ubuntu系统作为例子&#xff0c;最好是20版本。 1、克隆项目代码 …

2023.4.12

文章目录一&#xff1a;try catch处理异常1&#xff1a;原理&#xff1a;2&#xff1a;catch中如何处理异常**3&#xff1a;try-catch-finally**4&#xff1a;多重catch5&#xff1a;异常的分类6&#xff1a;throw和throws的区别7&#xff1a;练习题8&#xff1a;重载和重写的异…

Python后端架构演进

做了3年的后端开发, 经历一款SaaS产品从0到10(还没有到100, 哈哈哈)的过程, 3年间后端的架构逐步演变, 在微服务的实践过程中遇到的问题也越来越多, 在这里总结下. 产品是一款服务于人力资源的SaaS在线服务, 面向HR有Web Android/iOS 小程序多个客户端, 后端采用RESTful风格AP…

表id自增的方法

数据库主键id自增的方法&#xff0c;列举了几种如下 一、数据库自增&#xff08;部分数据库支持&#xff09; 创建表的时候设置id自增即可&#xff0c;或者后期修改表id自增 # mysql 语法 create table your_table_name(id bigint(20) not null auto_increment primary key …

Android技术分享 | 一行代码实现屏幕、声音采集

之前发布过一行代码实现安卓屏幕采集编码&#xff0c;并介绍了如何屏幕采集编码并进行了封装&#xff0c;简单的调用即可实现MediaProjection权限申请、H264硬编码、错误处理等功能。本文将介绍新增的功能&#xff0c;还是只需一行代码即可实现屏幕、声音采集。 一行代码实现屏…

【原创】万字长文讲解AI绘画基本技术原理

作者&#xff1a;黑夜路人 时间&#xff1a;2023年4月12日 AIGC是什么 AIGC - AI Generated Content &#xff08;AI生成内容&#xff09;&#xff0c;对应我们的过去的主要是 UGC&#xff08;User Generated Content&#xff09;和 PGC&#xff08;Professional user Generat…

c语言数据结构——树形结构之树和二叉树

前言 二叉树有什么用&#xff1f; 二叉树应用非常广泛。 在操作系统源程序中&#xff0c;树和森林被用来构造文件系统。我们看到的window和linux等文件管理系统都是树型结构。在编译系统中&#xff0c;如C编译器源代码中&#xff0c;二叉树的中序遍历形式被用来存放C 语言中的…

如何从阿里云盘下载大文件到自己的电脑或者租赁的服务器中?

首先进入阿里云盘的github项目处&#xff0c;里面有详细的说明&#xff0c;入口&#xff1a;https://github.com/tickstep/aliyunpan Ubuntu挂载阿里云盘作为自己的硬盘 如果你是Ubuntu系统的话&#xff0c;直接在使用apt命令在电脑安装阿里云盘即可&#xff0c;命令如下&…

Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)

Oracle基础部分二&#xff08;伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算&#xff09;1 伪列、伪表1.1 伪列1.2 伪表2 单个函数2.1 常用字符串函数2.1.1 length() 询指定字符的长度2.1.2 substr() 用于截取字符串2.1.3 concat() 用于字符串拼接2.2 常用数值函…