java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
2.工厂方法模式的主要优缺点
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
3.工厂方法模式主要角色
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
4.工厂方法模式结构图
5.工厂方法模式的实现
5.1 普通工厂模式,以消息发送为例
- 创建消息发送接口
package com.lw.designpattern.factorymethod.normal;/*** @Classname Sender* @Description 消息发送接口* @Author lw* @Date 2019-12-21 15:24*/
public interface Sender {public void send();
}
- 创建邮件发送类,实现Sender接口
package com.lw.designpattern.factorymethod.normal;/*** @Classname MailSender* @Description 邮件发送* @Author lw* @Date 2019-12-21 15:25*/
public class MailSender implements Sender {@Overridepublic void send() {System.out.println("邮件发送。。。。。。");}
}
- 创建短信发送类,实现Sender接口
package com.lw.designpattern.factorymethod.normal;/*** @Classname SmsSender* @Description 短信发送* @Author lw* @Date 2019-12-21 15:26*/
public class SmsSender implements Sender {@Overridepublic void send() {System.out.println("短信发送。。。。。。");}
}
如果后续有其他方式消息发送,则只需要创建消息发送类,实现Sender接口即可。违背开闭原则
- 测试代码
/*** 工厂设计模式-普通工厂模式*/@Testpublic void testNormalFactory(){// 邮件发送Sender sender = new MailSender();sender.send();// 短信发送Sender sender1 = new SmsSender();sender1.send();}
- 打印结果
5.2 工厂方法模式,以饮料产品及生产为例
- 创建饮料产品接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname DrinksProduct* @Description 饮料产品接口* @Author lw* @Date 2019-12-21 14:22*/
public interface DrinksProduct {public void show();
}
- 创建可乐产品类,实现DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname ColaProduct* @Description 可乐产品* @Author lw* @Date 2019-12-21 14:30*/
public class ColaProduct implements DrinksProduct {@Overridepublic void show() {System.out.println("可乐产品显示。。。。。。");}
}
- 创建雪碧产品类,实现DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname SpriteProduct* @Description 雪碧产品* @Author lw* @Date 2019-12-21 14:31*/
public class SpriteProduct implements DrinksProduct {@Overridepublic void show() {System.out.println("雪碧产品显示。。。。。。");}
}
- 创建饮料工厂接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname DrinksFactory* @Description 饮料工厂接口* @Author lw* @Date 2019-12-21 15:04*/
public interface DrinksFactory {public DrinksProduct product();
}
- 创建可乐工厂类,实现DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname ColaFactory* @Description 可乐工厂* @Author lw* @Date 2019-12-21 15:05*/
public class ColaFactory implements DrinksFactory {@Overridepublic DrinksProduct product() {System.out.println("开始生产可乐。。。。。。");return new ColaProduct();}
}
- 创建雪碧工厂类,实现DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;/*** @Classname SpriteFactory* @Description 雪碧工厂* @Author lw* @Date 2019-12-21 15:05*/
public class SpriteFactory implements DrinksFactory {@Overridepublic DrinksProduct product() {System.out.println("开始生产雪碧。。。。。。");return new SpriteProduct();}
}
后续增加其他产品,则需要增加一个具体产品类和一个对应的具体工厂类即可。满足开闭原则。
- 测试代码
/*** 工厂设计模式-工厂方法模式*/@Testpublic void testFactoryMethod(){// 生产可乐DrinksFactory drinksFactory = new ColaFactory();DrinksProduct drinksProduct = drinksFactory.product();drinksProduct.show();// 生产雪碧DrinksFactory drinksFactory1 = new SpriteFactory();DrinksProduct drinksProduct1 = drinksFactory1.product();drinksProduct1.show();}
打印结果
6.工厂方法模式的应用场景
- 客户只知道创建产品的工厂名,而不知道具体的产品名。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌。
相关文章:
java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点: 用户只需要知道具体工厂的名称…...
Python实验项目9 :网络爬虫与自动化
实验 1:爬取网页中的数据。 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…...
实验三:指令调度和延迟分支
一、实验目的 加深对指令调度技术的理解。加深对延迟分支技术的理解。熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。进一步理解指令调度技术对CPU性能的改进。进一步理解延迟分支技术对CPU性能的改进。 二、实验内容和步骤 首先要掌握MIPSsim模拟器的使用方法。见…...
【Oracle】PL/SQL语法、存储过程,触发器
一、Oracle数据类型 Orcle数据类型说明类比MySQL数据类型字符型CHAR固定长度的字符类型CHAR字符型VARCHAR2可变长度的字符类型VARCHAR字符型LONG大文本类型,最大2G数值型NUMBER数值类型,整数小数都可以,number(5)表示长度5的整数,…...
2020年第九届数学建模国际赛小美赛C题亚马逊野火解题全过程文档及程序
2020年第九届数学建模国际赛小美赛 C题 亚马逊野火 原题再现: 野火是指发生在乡村或荒野地区的可燃植被中的任何不受控制的火灾。这样的环境过程对人类生活有着重大的影响。因此,对这一现象进行建模,特别是对其空间发生和扩展进行建模&…...
保姆级 Keras 实现 YOLO v3 三
保姆级 Keras 实现 YOLO v3 三 一. 分配 anchor box二. 正负样本匹配规则三. 为每一个 anchor box 打标签3.1 anchor box 长什么样?3.2 每一个 anchor box 标签需要填充的信息有哪些?3.3 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x, \Delta y, \Delta w, \Delta h) (Δx,Δy,…...
HPM6750系列--第十篇 时钟系统
一、目的 上一篇中《HPM6750系列--第九篇 GPIO详解(基本操作)》我们讲解了HPM6750 GPIO相关内容,再进一步讲解其他外设功能之前,我们有必要先讲解一下时钟系统。 时钟可以说是微控制器系统中的心脏,外设必须依赖时钟才…...
【简单总结】中断类型号 中断向量 中断入口地址
通过中断类型号可以计算出中断向量的地址。 然后根据该地址可以在中断向量表中取出中断服务程序的入口地址(中断向量)。 而中断向量就是中断服务程序入口地址。 做个不严谨的图: 1:通过中断类型号找到中断向量 2:通…...
【Python百宝箱】从传感器到云端:深度解析Python在物联网中的多面应用
迈向智能未来:Python与物联网生态系统的完美融合 前言 随着物联网技术的不断发展,Python作为一种灵活且强大的编程语言,逐渐成为物联网开发的重要工具之一。本文将深入探讨物联网领域中常用的Python库和框架,涵盖了从轻量级通信…...
weston 1: 编译与运行傻瓜教程(补充)
系统kubuntu23.10 git clone https://gitlab.freedesktop.org/wayland/wayland.git 86588fbdebe7f6ac9363d98f524e4ae14bd4b019 meson build/ --prefix$WLD ninja -C build/ install git clone https://gitlab.freedesktop.org/wayland/wayland-protocols.git c4f559866f13…...
微服务保护--线程隔离(舱壁模式)
一、线程隔离的实现方式 线程隔离有两种方式实现: 线程池隔离 信号量隔离(Sentinel默认采用) 如图: 线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果 信号量隔离:…...
集群监控Zabbix和Prometheus
文章目录 一、Zabbix入门概述1、Zabbix概述2、Zabbix 基础架构3、Zabbix部署3.1 前提环境准备3.2 安装Zabbix3.3 配置Zabbix3.4 启动停止Zabbix 二、Zabbix的使用与集成1、Zabbix常用术语2、Zabbix实战2.1 创建Host2.2 创建监控项(Items)2.3 创建触发器&…...
K8S(七)—污点、容忍
目录 污点、容忍污点(Taints):容忍(Tolerations):如何一起使用污点和容忍:操作符(Equal、Exists)例子基于污点的驱逐基于节点状态添加污点 污点、容忍 官网地址…...
新视野大学英语1 词组 12.17
embarrassment和awkwardness的区别以及各自的组词。 "Embarrassment" 和 "awkwardness" 都可以用来描述一种尴尬或不舒服的感觉,但它们有一些微妙的区别。 "Embarrassment" 指的是由于尴尬、困窘或难堪的情况而产生的感觉。 这种感觉…...
springboot实战项目之使用AOP技术实现各种角色的鉴权功能
前言 项目开发需求,会员有不同的角色,不同的角色被赋予不同的权限,这就需要对会员的操作进行鉴权处理。 方案 采用aop,可实现满足这种需求,创建匿名类。对外提供接口的时候都会拦截,这种会有弊端&#x…...
华为配置基本QinQ示例
组网需求 如图1所示,网络中有两个企业,企业1有两个分支,企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连,且公网中存在其它厂商设备,其外层VLAN Tag的TPID值为0x9100。 现…...
【漏洞复现】系列集合
该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作 Apache Apache_HTTPD_未知后缀名解析Apache_HTTPD_换行解析(CVE-2017-15715)Apache_HTTPD_多后缀解析Apache_HTTP_2.4.50_路径穿越(CVE-2021-42013)Apache_HTTP_2.4.49_路径穿越(CVE-2021-41…...
TCP报文头(首部)详解
本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解,部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段,一个报文段由TCP首部(报文头)和TCP数据两部分组成,其中TCP首部尤其重…...
第4章-第1节-初识Java的数组
1、数组 属于Java内存层面的一款容器(crud操作)。 概念: 内存中的一块存储区域(空间),内部有一组连续的小区域(元素空间),有数据类型的限定,可以存入一组匹配类型的数据,并且根据需要可以改动元素空间中的数据内…...
大数据技术10:Flink从入门到精通
导语:前期入门Flink时,可以直接编写通过idea编写Flink程序,然后直接运行main方法,无需搭建环境。我碰到许多初次接触Flink的同学,被各种环境搭建、提交作业、复杂概念给劝退了。前期最好的入门方式就是直接上手写代码&…...
IDEA中工具条中的debug按钮不能用了显示灰色
IDEA中工具条中的debug按钮不能用了显示灰色 1. 问题描述 IDEA上的DEBUG按钮突然变成了灰色: 2. 解决办法 一通搜索,终于找到解决办法 点击 File -> Project Structure如下图操作 3. 重启,解决 4. 参考 https://www.cnblogs.com…...
【MySQL内置函数】
目录: 前言一、日期函数获取日期获取时间获取时间戳在日期上增加时间在日期上减去时间计算两个日期相差多少天当前时间案例:留言板 二、字符串函数查看字符串字符集字符串连接查找字符串大小写转换子串提取字符串长度字符串替换字符串比较消除左右空格案…...
C++相关闲碎记录(14)
1、数值算法 (1)运算后产生结果accumulate() #include "algostuff.hpp"using namespace std;int main() {vector<int> coll;INSERT_ELEMENTS(coll, 1, 9);PRINT_ELEMENTS(coll);cout << "sum: " << accumulate(…...
18、vue3(十八):菜单权限,按钮权限,打包,发布nginx
目录 一、菜单权限和路由拆分 1.思路分析 2.深拷贝插件 3.代码实现 4.效果展示...
04 在Vue3中使用setup语法糖
概述 Starting from Vue 3.0, Vue introduces a new syntactic sugar setup attribute for the <script> tag. This attribute allows you to write code using Composition API (which we will discuss further in Chapter 5, The Composition API) in SFCs and shorte…...
vite+ts——user.ts——ts接口定义+axios请求的写法
import axios from axios; import qs from query-string; import {UserState} from /store/modules/user/types;export interface LoginData{username:string;password:string;grant_type?:string;scope?:string;client_id?:string;client_secret?:string;response_type?:…...
环境搭建及源码运行_java环境搭建_mysql安装
书到用时方恨少、觉知此时要躬行;拥有技术,成就未来,抖音视频教学地址: 1、介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle旗下产品。MySQL是最…...
Android camera的metadata
一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…...
ElasticSearch面试题
1.介绍下es的架构? es采用的是分布式的架构,es集群中会有多个结点,而结点的角色主要有下面几种。 协调结点: 请求路由能力,将请求内容将请求转发给对应的结点进行处理。 master结点: 结点管理ÿ…...
C++ 数据结构知识点合集-C/C++ 数组允许定义可存储相同类型数据项的变量-供大家学习研究参考
#include <iostream> #include <cstring>using namespace std;// 声明一个结构体类型 Books struct Books {char title[50];char author[50];char subject[100];int book_id; };int main( ) {Books Book1; // 定义结构体类型 Books 的变量 Book1Books …...
网站信息内容建设管理/网页设计可以自学吗
在这里处理一点上传脚本.我正在尝试检查上传的图像是否真的是图像,而不仅仅是重命名的PHP文件.发布脚本后,我可以打印数组foreach ($_FILES[images][name] as $key > $value){print_r(getimagesize($_FILES[images][tmp_name][$key]));这很好,所以它不会返回false.但即使我上…...
信息网站设计案例/猪肉价格最新消息
2月11日消息,日前,红黄蓝教育(NYSE:RYB)发布公告,宣布以1.25亿元收购新加坡一家民营儿童教育集团近70%的股权,并即将从“RYB Education”更名为“GEH Education”,目前尚未公布对应的…...
社交(sns)网站的完整设计思路/网络营销品牌公司
Unix 系统下的 Apache 1.3.x本节包括在 Unix 平台的 Apache 下安装 PHP 的说明和提示。我们在另外的页面也有Apache 2 的安装和说明。可以从核心配置选项列表以及位于手册对应部分的特定扩展配置选项中选择参数并在安装步骤第10 步将它们添加到 configure命令中。版本号在这里被…...
web网站开发基础jar/重庆网站建设与制作
(1)MAC(Media Access Control)地址,或称为MAC位址、硬件位址,用来定义网络设备的位置,是被烧录在Network Interface Card(网卡NIC)里的。在网络底层的物理传输过程中,是通过物理地址来识别主机的࿰…...
免费个人网站制作在线/谷歌关键词分析工具
1.为驳回编译器自动生成函数的技能,可把这些函数的声明放入private,如果是继承类型可把base class的这些函数声明private,可在编译期间得到警告转载于:https://www.cnblogs.com/xuaidongstdudyrecording/p/7259169.html...
肉山谷英雄传说新手任务登录英文网站怎么做/淘宝如何刷关键词增加权重
达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。 翰翰的家里有一辆飞行车。 有一天飞行车的电路板突然出现了故障,导致无法启动。 电路板的整体结构是一个R行C列的网格&#…...