Android工厂模式
工厂模式分为三种 :简单工厂模式 、工厂方法模式 、抽象工厂模式 。
目录
简单工厂模式
UML图
实现
使用场景:
优点 :
缺点:
工厂方法模式
UML图
实现
使用场景:
优点:
缺点:
抽象工厂模式
UML图
实现:
场景:
优点:
缺点:
总结:
简单工厂模式
简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法);简单工厂模式可以理解为负责生产对象的一个类,称为“工厂类”。
简单工厂模式属于创建型模式 。
UML图
简单工厂模式角色说明:
- Product(抽象产品类):要创建的复杂对象,定义对象的公共接口。
- ConcreteProduct(具体产品类):实现Product接口。
- Factory(工厂类):返回ConcreteProduct实例。
总结:一个抽像产品类,可以派生出多个具体产品类 。一个具体工厂类,通过往此工厂的static 方法中传入不同参数,产出不同的具体产品类的实例 。
实现
(1) 创建抽象产品类,定义公共接口:
public interface Product {void show();
}
(2) 创建具体的产品类,实现Proudct类:
public class ProductA implements Product{@Overridepublic void show() {System.out.println("我是产品A");}
}
public class ProductB implements Product{@Overridepublic void show() {System.out.println("我是产品B");}
}
(3) 创建工厂类,生产出具体的产品:
public class ProductFactory {public static Product createProduct(String productName){Product product=null;switch (productName){case "A":product=new ProductA();break;case "B":product=new ProductB();break;}return product;}
}
(4)测试
public static void main(String[] args){ProductFactory.createProduct("A").show();}
使用场景:
- 工厂类负责常见的"产品"对象比较少,且工厂类功能稳定,不需要扩展;
- 客户端只需传入工厂类的参数就能获得对应的产品对象,而无需关心创建对象的具体逻辑。
- 生成复杂对象时,确定只有一个工厂类的时候
优点 :
代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建
缺点:
违背开放封闭原则,若需添加新产品必须修改工厂类逻辑,会造成工厂逻辑过于复杂。
简单工厂模式使用了静态工厂方法,因此静态方法不能被继承和重写。
工厂类包含了所有实例(产品)的创建逻辑,若工厂类出错,则会造成整个系统都会受到影响。
工厂方法模式
定义: 定义一个用于创建对象的接口,让子类决定实例化哪个类 ,工厂方法使一个类的实例化延迟到其子类
概括:Concrete Product 具有共同的父类Product ,Concrete Factory也具有共同的父类Factory。每个具体的子类Concrete Factory 产出一个对应的Concrete Product。
UML图
总结 :一个抽象产品类,可以派生出多个具体产品类 。一个抽象工厂类 ,可以派生出多个具体工厂类 ,每个具体工厂类只能创建一个具体产品类的实例。
实现
(1)、创建抽象产品
public interface Product {void show();
}
(2)、创建具体的产品,实现Product类
public class ProductA implements Product{@Overridepublic void show() {System.out.println("我是产品A");}
}
public class ProductB implements Product{@Overridepublic void show() {System.out.println("我是产品B");}
}
(3)、创建抽象工厂
public interface Factory {<T extends Product> T createProduct();
}
(4) 、创建具体的工厂
public class FactoryImpl implements Factory{@Overridepublic <T extends Product> T createProduct(Class<T> cls) {Product product=null;try{product= (Product) Class.forName(cls.getName()).newInstance();}catch (Exception e){}return (T)product;}
}
(5)测试
public static void main(String[] args){FactoryImpl factory=new FactoryImpl();Product productA=factory.createProduct(ProductA.class);productA.show();}
使用场景:
- 工厂类负责常见的"产品"对象比较多,且工厂类功能不稳定,需要扩展;
- 客户端只需传入产品类的参数就能获得对应的产品对象,而无需关心创建对象的具体逻辑。
- 生成复杂对象时,确定只有多个工厂类的时候
优点:
1、更符合开放封闭原则
新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可,而简单工厂模式需要修改工厂类的判断逻辑
2、符合单一职责原则
每个具体工厂类只负责创建对应的产品,而简单工厂中的工厂类存在复杂的switch逻辑判断
3、不使用静态工厂方法,可以形成基于继承的等级结构,而简单工厂模式的工厂类使用静态工厂方法
总结:工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。
缺点:
1、添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;
2、由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
3、虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类;
4、一个具体工厂只能创建一种具体产品
抽象工厂模式
定义:为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们具体的类。
介绍:
抽象工厂模式属于创建型模式。
工厂方法模式每个工厂只能创建一种类型的产品,而抽象工厂模式则能够创建多种类型的产品。
例如:硬盘工厂只生产硬盘这种产品,而电脑工厂则组合不同的硬盘、内存、CPU等生产出电脑来。
UML图
角色说明:
AbstractProduct(抽象产品类):定义产品的公共接口。
ConcreteProduct(具体产品类):定义产品的具体对象,实现抽象产品类中的接口。
AbstractFactory(抽象工厂类):定义工厂中用来创建不同产品的方法。
ConcreteFactory(具体工厂类):实现抽象工厂中定义的创建产品的方。
实现:
(1)抽象产品类
//抽象产品类-- CPUpublic abstract class CPU {public abstract void showCPU();}//抽象产品类-- 内存public abstract class Memory {public abstract void showMemory();}//抽象产品类-- 硬盘public abstract class HD {public abstract void showHD();}
(2)创建具体产品类
//具体产品类-- Intet CPUpublic class IntelCPU extends CPU {@Overridepublic void showCPU() {System.out.println("Intet CPU");}}//具体产品类-- AMD CPUpublic class AmdCPU extends CPU {@Overridepublic void showCPU() {System.out.println("AMD CPU");}}//具体产品类-- 三星 内存public class SamsungMemory extends Memory {@Overridepublic void showMemory() {System.out.println("三星 内存");}}//具体产品类-- 金士顿 内存public class KingstonMemory extends Memory {@Overridepublic void showMemory() {System.out.println("金士顿 内存");}}//具体产品类-- 希捷 硬盘public class SeagateHD extends HD {@Overridepublic void showHD() {System.out.println("希捷 硬盘");}}//具体产品类-- 西部数据 硬盘public class WdHD extends HD {@Overridepublic void showHD() {System.out.println("西部数据 硬盘");}}
(3) 创建抽象工厂类
//抽象工厂类,电脑工厂类public abstract class ComputerFactory {public abstract CPU createCPU();public abstract Memory createMemory();public abstract HD createHD();}
(4)创建具体工厂类
//具体工厂类--联想电脑public class LenovoComputerFactory extends ComputerFactory {@Overridepublic CPU createCPU() {return new IntelCPU();}@Overridepublic Memory createMemory() {return new SamsungMemory();}@Overridepublic HD createHD() {return new SeagateHD();}}//具体工厂类--华硕电脑public class AsusComputerFactory extends ComputerFactory {@Overridepublic CPU createCPU() {return new AmdCPU();}@Overridepublic Memory createMemory() {return new KingstonMemory();}@Overridepublic HD createHD() {return new WdHD();}}//具体工厂类--惠普电脑public class HpComputerFactory extends ComputerFactory {@Overridepublic CPU createCPU() {return new IntelCPU();}@Overridepublic Memory createMemory() {return new KingstonMemory();}@Overridepublic HD createHD() {return new WdHD();}}
public static void main(String[] args){System.out.println("--------------------生产联想电脑-----------------------");ComputerFactory lenovoComputerFactory = new LenovoComputerFactory();lenovoComputerFactory.createCPU().showCPU();lenovoComputerFactory.createMemory().showMemory();lenovoComputerFactory.createHD().showHD();System.out.println("--------------------生产华硕电脑-----------------------");ComputerFactory asusComputerFactory = new AsusComputerFactory();asusComputerFactory.createCPU().showCPU();asusComputerFactory.createMemory().showMemory();asusComputerFactory.createHD().showHD();System.out.println("--------------------生产惠普电脑-----------------------");ComputerFactory hpComputerFactory = new HpComputerFactory();hpComputerFactory.createCPU().showCPU();hpComputerFactory.createMemory().showMemory();hpComputerFactory.createHD().showHD();
}
场景:
生产多个产品组合对象时。
优点:
代码解耦 ,创建实例工作与使用实例的工作分开 ,使用者不用担心类对象如何创建。
缺点:
如果增加新的产品,则修改抽象工厂和所有的具体工厂,违反了开放封闭原则
工厂方法模式与抽象工厂模式比较
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性。
抽象工厂模式则可以提供多个产品对象,而不是单一的产品对象。
总结:
单一产品对象,产品内不包含其他产品,多个产品对象,一个产品要其他许多配件产品组成的
1.单一产品对象并且不涉及到扩展的话,用简单工厂模式
2.单一产品对象并且涉及到扩展的话,用工厂方法模式
3.多个产品对象用抽象工厂模式
参考文章:
Android工厂模式 - 爱码网
相关文章:

Android工厂模式
工厂模式分为三种 :简单工厂模式 、工厂方法模式 、抽象工厂模式 。 目录 简单工厂模式 UML图 实现 使用场景: 优点 : 缺点: 工厂方法模式 UML图 实现 使用场景: 优点: 缺点: 抽象工厂模式 UM…...
神经网络硬件加速器-架构篇
架构设计 常规架构通常包括两种: 1、全流水线架构,顾名思义,将整个神经网络进行平铺,并对每一层进行优化设计,优点:实现高吞吐率和低延时。缺点:消耗大量硬件资源,通常无法跨网络或…...
Python raise用法(超级详细,看了无师自通)
是否可以在程序的指定位置手动抛出一个异常?答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可。 大家可能会感到疑惑,即我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢&#…...

1.SpringSecurity快速入门
*SpringScurity的核心功能: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:经过认证后判断当前用户是否有权限进行某个操作 *第一步:创建springboot工程 *第二步:引入SpringSecurity依赖 *第三步:写controller,访问对应的url:localhos…...

Graph Partition: Edge cut and Vertex cut
Graph PartitionEdge cut and Vertex cutEdge cutVertex cut实际如何进行点分割和边分割的呢?Graph store format情况1:按照边列表存储:情况2:按照邻接表存储:Edge cut and Vertex cut 图结构描述了数据流动ÿ…...

Javascript周学习小结(初识,变量,数据类型)
JS的三大书写方式行内式如图所示:几点说明:JS的行内式写在HTML的标签内部,(常以on开头),如onclick行内式常常使用单引号括住字符串以区分HTML的双引号可读性差,不建议使用引号易出错,不建议使用特殊情况下使…...

C语言-基础了解-10-C函数
C函数 一、C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&…...

【LeetCode】剑指 Offer(16)
目录 题目:剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer …...
第三十九章 linux-并发解决方法二(互斥锁mutex)
第三十九章 linux-并发解决方法二(互斥锁mutex) 文章目录第三十九章 linux-并发解决方法二(互斥锁mutex)互斥锁的定义与初始化互斥锁的DOWN操作互斥锁的UP操作用count1的信号量实现的互斥方法还不是Linux下经典的用法,…...
脚本方式本地仓库jar包批量导入maven私服
脚本内容,将以下内容保存为mavenimport.sh,放置于需要上传的目录下,可以是顶层目录,或者某个分包的目录,若私服已有待上传的包,则执行会被替换 #!/bin/bash # copy and run this script to the root of th…...
【c++】引用的学习
引用的定义和声明 引用是一种别名,它允许使用与原变量相同的内存位置。在C中,引用是使用&符号来定义的。引用必须在定义时初始化,并且可以与原变量分别使用。 int a 10; int& b a; // 定义了一个引用b,它指向a引用的作用…...
linux 软件安装及卸载
1.联网在线安装及卸载ubuntu环境下:使用apt-get 工具apt-get install - 安装软件包apt-get remove - 移除(卸载)软件包CentOS环境下:使用yum工具 (银河麒麟系统属于centos)yum install - 安装软件包yum rem…...

XShell连接ubuntu20.04.LTS
1 下载XshellXShell官方下载地址打开XSHELL官方下载地址,我们可以选择【家庭和学校用户的免费许可证】,输入邮箱之后即可获得下载链接安装非常简单,跟着提示进行即可。2 连接ubuntu2.1 查看ubuntu的ip地址输入命令查看ip地址ifconfig刚开始可…...

【FPGA】Verilog:MSI/LSI 组合电路之解码器 | 多路分解器
写在前面:本章将理解编码器与解码器、多路复用器与多路分解器的概念,通过使用 Verilog 实现多样的解码器与多路分解器,通过 FPGA 并使用 Verilog 实现。 Ⅰ. 前置知识 0x00 解码器与编码器(Decoder / Encoder) 解码器…...

深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架
文章目录一、动手实现一个动态代理框架1、初识javassist2、使用javassist实现一个动态代理框架二、JDK动态代理1、编码实现2、基本原理(1)getProxyClass0方法(2)总结写在后面一、动手实现一个动态代理框架 1、初识javassist Jav…...

一、策略模式的使用
1、策略模式定义: 策略模式(Strategy Pattern)定义了一组策略,分别在不同类中封装起来,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距…...

Verilog使用always块实现时序逻辑
这篇文章将讨论 verilog 中一个重要的结构---- always 块(always block)。verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。与组合逻辑电路相反,时序电路电路使用时钟并一定需要触发器等存储元件。因此,…...

面向对象设计模式:行为型模式之迭代器模式
一、迭代器模式,Iterator Pattern aka:Cursor Pattern 1.1 Intent 意图 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种按顺序访问聚合对象的元素而不公开其基…...

如何快速在企业网盘中找到想要的文件
现在越来越多的企业采用企业网盘来存储文档和资料,而且现在市面上的企业网盘各种各样。在使用企业网盘过程中,很多用户会问到企业网盘中如何快速搜索文件的问题。但是无论是“标签”功能还是普通的“关键词搜索”功能,都是单层级的࿰…...

香橙派5使用NPU加速yolov5的实时视频推理(二)
三、将best.onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20.04系统中了,我的Ubuntu系统中已经下载好了anaconda,使用anaconda的好处就是可以方便的安装一些库,而且还可以利用conda来配置虚拟环境,做到环境与环境之间相互独立。…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...