反射和工厂设计模式---工厂设计模式
一、工厂设计模式概述
■什么是工厂设计模式
工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。
它属于创建型模式(单例模式就是创建型模式的一种),这种模式让我们在创建对象时不会直接暴露创建逻辑,而是通过使用一个共同的接口来完成对象的创建。
工厂模式可以分为三种,分别是简单工厂模式、工厂方法模式以及抽象工厂模式(后面的两种模式都是基
于第一种模式进行的),我们主要来讲解简单工厂模式。
■为什么要用工厂模式
其实工厂设计模式就是根据现实抽象过来的模式,
我们在Java中,习惯要用什么对象,就去找它的类去new,主要其实并不好,类与类的耦合度会比较高,而且我们现实中也不会你需要买什么东西就跑去生产车间里去买吧,我们生活中更多的是一个商店或者是商场把对应的商品从生产线上购买到店里来,然后你需要什么跟老板说你要买的商品名称,老板就提供给你。
由商店来管理这些对象,我们不关心这些商品的生产细节。
■工厂设计模式的优点
➢调用者想创建一一个对象,只要知道其名称(也就是不同的标签)就可以在工厂获取具体的
对象;
➢扩展性强,如果想增加一个产品(也就是具体的对象),只要扩展工厂类就可以(也就是
增加不同的标签,增加不同标签所对应的对象) ;
➢屏蔽产品的具体实现,调用者只关心产品的接口、无需关心内部实现;
➢面向接口编程,体现了面向对象的思想;
二、demo
1、使用统一的接口来管理不同的类
public class FactoryDemo1 {public static void main(String[] args) {Fruit apple = new Apple();Fruit banane = new Banane();apple.eat();banane.eat();}
}
interface Fruit{void eat();
}
class Apple implements Fruit{public void eat() {System.out.println("苹果真好吃");}
}
class Banane implements Fruit{public void eat() {System.out.println("香蕉真好吃");}
}
2、使用一个统一的类对象生产车间来管理对象的生产
public class FactoryDemo2 {public static void main(String[] args) {FruitFatory fatory = new FruitFatory();Fruit apple = fatory.getApple();Fruit banane = fatory.getBanane();apple.eat();banane.eat();}
}
class FruitFatory{public Fruit getApple() {return new Apple();}public Fruit getBanane() {return new Banane();}
}
interface Fruit{void eat();
}
class Apple implements Fruit{public void eat() {System.out.println("苹果真好吃");}
}
class Banane implements Fruit{public void eat() {System.out.println("香蕉真好吃");}
}
3、使用一个工厂来生产多个不一样的水果
public class FactoryDemo3 {public static void main(String[] args) {Fruit apple = FruitFatory.getApple();Fruit banane = FruitFatory.getBanane();apple.eat();banane.eat();}
}
class FruitFatory{public static Fruit getApple() {return new Apple();}public static Fruit getBanane() {return new Banane();}
}
interface Fruit{void eat();
}
class Apple implements Fruit{public void eat() {System.out.println("苹果真好吃");}
}
class Banane implements Fruit{public void eat() {System.out.println("香蕉真好吃");}
}
4、使用工厂的一个方法就能够构建不同的对象
public class FactoryDemo4 {public static void main(String[] args) {Fruit apple = FruitFatory.getFruit("apple");Fruit banane = FruitFatory.getFruit("banane");apple.eat();banane.eat();}
}
class FruitFatory{public static Fruit getFruit(String fruitName) {if("apple".equalsIgnoreCase(fruitName)) {return new Apple();}else if("banane".equalsIgnoreCase(fruitName)) {return new Banane();}else {return null;}}}
interface Fruit{void eat();
}
class Apple implements Fruit{public void eat() {System.out.println("苹果真好吃");}
}
class Banane implements Fruit{public void eat() {System.out.println("香蕉真好吃");}
}
5、终极版 加入反射
/src/lession14/entity
public interface Fruit {void eat();
}
public class Pear implements Fruit{@Overridepublic void eat() {System.out.println(" 梨真好吃 ");}}
public class Banane implements Fruit{public void eat() {System.out.println(" 香蕉真好吃 ");}
}
public class Apple implements Fruit{public void eat() {System.out.println(" 苹果真好吃 ");}
}
/*** * 想让你的工厂直接不需要进行频繁的更改,它也可以顺利的生产出* 我们想要的对象!**/
public class FactoryDemo5 {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Fruit apple = FruitFatory.getFruit("apple");Fruit banane = FruitFatory.getFruit("banane");Fruit pear = FruitFatory.getFruit("pear");apple.eat();banane.eat();pear.eat();}
}
class FruitFatory{public static Fruit getFruit(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class<?> classObj = Class.forName("lession14.entity."+initClassName(className));return (Fruit) classObj.newInstance();}public static String initClassName(String className) {StringBuilder sb = new StringBuilder();return sb.append((className.charAt(0)+"").toUpperCase()).append(className.substring(1).toLowerCase()).toString();}
}
在Demo2中,我们已经可以通过-一个工厂类来构建具体的类对象了,但是还需要像调用方法一样来操作, 并且不同的对象不同的方法名,能否进一步 进行优化?
到Demo3中,我们直接使用一个统一-的方 法来获取不同的对象,在方法内部进行名字的判断就可以了,然后通过new或者是通过反射来获取到指定的对象。
在该模式中,工厂类是整个模式的关键。它包含必要的判断逻辑(比如根据外界给定的信息,决定究竟应该创建哪个具体类的对象)。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
但是,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。并且,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。在具体调用比较麻烦。
相关文章:
反射和工厂设计模式---工厂设计模式
一、工厂设计模式概述 ■什么是工厂设计模式 工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。 它属于创建型模式(单例模式就是创建型模式的一种),这种模式让我们在创建对象时不会直接暴露创建逻辑,而是通过使用一个共同的接口来完成对象的…...
【算法——双指针】LeetCode 283 移动零
题目描述: 思路: (双指针) O(n)O(n)O(n) 给定一个数组 nums,要求我们将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。 如图所示,数组nums [0,1,0,3,12],移动完成后变成nums [1,3,12,0,0] &am…...
腾讯云轻量服务器和云服务器的CPU处理器有差别吗?
腾讯云轻量应用服务器和CVM云服务器的CPU处理器性能有差别吗?创建轻量应用服务器时不支持指定底层物理服务器的CPU型号,腾讯云将随机分配满足套餐规格的物理CPU型号,通常优先选择较新代次的CPU型号。而云服务器CVM的CPU处理器型号、主频都是有…...
Redis_亿级访问量数据处理
11. 亿级访问量数据处理 11.1 场景表述 手机APP用户登录信息,一天用户登录ID或设备ID电商或者美团平台,一个商品对应的评论文章对应的评论APP上有打卡信息网站上访问量统计统计新增用户第二天还留存商品评论的排序月活统计统计独立访客(Unique Vistito…...
Java-类型和变量(基于C语言的补充)
一个简单的Java程序 args){ System.out.println("Hello,world"); } }通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成: 1.源文件(扩展名为*.java):源文件带有类的定义…...
机器学习笔记:李宏毅diffusion model
1 概念原理 首先sample 一个都是噪声的vector然后经过denoise network 过滤一些杂质接着继续不断denoise,直到最后出来一张清晰图片 【类似于做雕塑,一开始只是一块石头(噪声很杂的雕塑),慢慢雕刻出想要的花纹】 同一个…...
STM32--TIM定时器(2)
文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较 输出比较,简称OC(Output Compare)。 输出比较的原理是,当定时器计数值与比较值相等或者满足某种…...
git Authentication failed
情况是这样的,之前看代码只是clone了一份,但随着分支越来越多,有时候切换分支时必须先把修改的代码 stash 一下,觉得很麻烦,于是又clone了一份代码。然后pull代码是正常的,当push 代码的时候,去…...
【软考】2023系统架构设计师考试
目录 1 软考资格设置 2 考试报名 3 考试准备 4 参加考试 5 考试感受 6 其他 1 软考资格设置 2 考试报名 报名网址:https://www.ruankao.org.cn/ 3 考试准备 4 参加考试 2023年下半年系统架构设计师考试时间为11月4、5日。 5 考试感受 6 其他 最近好像有地区…...
opencv基础55-获取轮廓的特征值及示例
轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比(AspectRation)来描述轮廓,例如矩形轮廓的宽高比为: 宽高比 宽度&am…...
OpenCV图像处理——形态学操作
目录 连通性形态学操作腐蚀和膨胀开闭运算礼帽和黑帽 连通性 形态学操作 形态学转换是基于图像形状的一些简单操作。它通常在二进制图像上执行。腐蚀和膨胀时两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽黑帽等 腐蚀和膨胀 cv.erode…...
修改VS Code终端的显示行数
文章目录 前言修改VS Code终端显示行数参考 前言 在我们使用VS Code运行代码的过程中,有时需要再终端中显示很多的运行过程信息或者结果。然而,VS Code的终端默认显示1000行的内容,随着显示内容的增多,之前的内容就丢失了。为了解…...
C++学习| MFC简单入门
前言:因为接手了CMFC的程序,所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC(Microsoft Foundation Classes微软…...
“一日之际在于晨”,欢迎莅临WAVE SUMMIT上午场:Arm 虚拟硬件早餐交流会
8月16日,盛夏的北京将迎来第九届WAVE SUMMIT深度学习开发者大会。在峰会主论坛正式开启前,让我们先用一份精美的元气早餐,和一场“Arm虚拟硬件交流会”,唤醒各位开发小伙伴的开发魂! 8月16日,WAVE SUMMIT大…...
leetcode454. 四数相加 II
题目:leetcode454. 四数相加 II 描述: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] num…...
PHP证券交易员学习网站mysql数据库web结构apache计算机软件工程网页wamp
一、源码特点 PHP证券交易员学习网站 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 下载地址https://download.csdn.net/download/qq_41221322/88205549 PHP证券交易员…...
对p-n结/AlGaN/GaN HEMTs中n-GaN掺杂浓度对栅极可靠性的影响
目录 第35届功率半导体器件与集成电路国际研讨会论文集2023年5月28日至6月1日,中国香港南方科技大学电气电子工程系,深圳标题:Impacts of n-GaN Doping Concentration on Gate Reliability of p-n Junction/AlGaN/GaN HEMTs摘要信息解释研究了…...
Mac M2 Pro安装使用Cocoapods
Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发,所以在新电脑上安装Cocoapods 在升级gem,sudo gem update --system,和安装cocoapods时都遇到如下的提示: ERROR: While executing gem ... (Errno::EPERM)Operation not per…...
枚举缓存工具
此文章为笔记,为阅读其他文章的感受、补充、记录、练习、汇总,非原创,感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…...
【BASH】回顾与知识点梳理(二十五)
【BASH】回顾与知识点梳理 二十五 二十五. 特殊shell、PAM 模块、讯息传递和大量建置账号25.1 特殊shell特殊的 shell, /sbin/nologin 25.2 PAM模块25.3 Linux 主机上的用户讯息传递查询使用者: w, who, last, lastlog使用者对谈: write, mesg, wall使用…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
