23种设计模式-工厂模式
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需将具体的对象创建逻辑暴露给客户端。在Java中,工厂模式常常用于创建复杂对象或对象的构造过程涉及到多个步骤的情况。
在Android开发中,工厂模式也经常被使用,例如创建数据库的实例或创建网络请求的实例等。接下来,我们将通过代码举例说明工厂模式的具体应用。
我们先定义一个接口Product,用于表示工厂模式中所创建的对象的抽象类:
public interface Product {void doSomething();
}
然后,我们定义两个具体的产品类,ConcreteProduct1和ConcreteProduct2,它们实现了Product接口:
public class ConcreteProduct1 implements Product {@Overridepublic void doSomething() {System.out.println("This is ConcreteProduct1.");}
}public class ConcreteProduct2 implements Product {@Overridepublic void doSomething() {System.out.println("This is ConcreteProduct2.");}
}
接下来,我们定义一个工厂类Factory,它用于创建Product对象:
public class Factory {public static Product createProduct(String type) {if ("type1".equals(type)) {return new ConcreteProduct1();} else if ("type2".equals(type)) {return new ConcreteProduct2();} else {return null;}}
}
在Factory类中,我们定义了一个静态方法createProduct,它根据传入的参数type返回一个对应的Product对象。如果type参数的值为"type1",则返回ConcreteProduct1的实例,如果为"type2",则返回ConcreteProduct2的实例。
下面,我们通过一个示例代码来演示如何使用工厂模式创建对象:
public class Client {public static void main(String[] args) {Product product1 = Factory.createProduct("type1");product1.doSomething();Product product2 = Factory.createProduct("type2");product2.doSomething();}
}
在Client类中,我们通过调用Factory类中的静态方法createProduct来创建Product对象。当参数为"type1"时,返回ConcreteProduct1对象,当参数为"type2"时,返回ConcreteProduct2对象。然后,我们调用Product对象的doSomething方法来执行相应的操作。
在安卓开发中,工厂模式经常被用于创建对象,特别是创建不同类型的对象。以下是一些示例:
- LayoutInflater
在安卓中,LayoutInflater 是一个常用的工具类,用于将 XML 布局文件转换成相应的视图对象。LayoutInflater 使用工厂模式来创建视图对象,从而使得它能够根据 XML 布局文件中定义的标签类型动态创建对应的视图对象。
- SQLiteDatabase
在 Android 中,SQLite 是一种轻量级的关系型数据库,它被广泛地用于存储和检索应用程序的数据。在使用 SQLiteDatabase 类的时候,通常需要创建一个 SQLiteDatabaseHelper 类来管理数据库的创建和版本控制。在 SQLiteDatabaseHelper 类中,使用了工厂模式来创建 SQLiteDatabase 对象,从而使得应用程序能够更加方便地管理数据库。
- Bitmap
在 Android 中,Bitmap 是一种表示图像的类。由于 Bitmap 对象通常比较大,因此在创建 Bitmap 对象时,需要谨慎地使用内存。在 BitmapFactory 类中,使用了工厂模式来创建 Bitmap 对象,从而使得应用程序能够更加灵活地控制内存使用。
- Intent
在 Android 中,Intent 是一种用于在应用程序之间传递数据和启动组件的对象。在创建 Intent 对象时,通常需要指定其类型和数据。在 Intent 类中,使用了工厂模式来创建 Intent 对象,从而使得应用程序能够更加灵活地处理 Intent。
下面是一个例子,展示了工厂模式在安卓开发中的应用。
// 定义一个接口,用于创建不同类型的 Fragment
public interface FragmentFactory {Fragment createFragment();
}// 实现 Fragment 工厂接口,用于创建主页 Fragment
public class HomeFragmentFactory implements FragmentFactory {@Overridepublic Fragment createFragment() {return new HomeFragment();}
}// 实现 Fragment 工厂接口,用于创建设置 Fragment
public class SettingsFragmentFactory implements FragmentFactory {@Overridepublic Fragment createFragment() {return new SettingsFragment();}
}// 定义一个 Fragment 类
public abstract class Fragment extends Object {// Fragment 初始化方法,由工厂方法调用protected void onCreate(Bundle savedInstanceState) {// ...}
}// 主页 Fragment
public class HomeFragment extends Fragment {// ...
}// 设置 Fragment
public class SettingsFragment extends Fragment {// ...
}
在这个例子中,FragmentFactory 接口用于创建不同类型的 Fragment,HomeFragmentFactory 和 SettingsFragmentFactory 实现了该接口,用于创建不同的 Fragment 实例。当需要创建特定类型的 Fragment 时,可以使用相应的工厂方法,如:
FragmentFactory factory = new HomeFragmentFactory();
Fragment fragment = factory.createFragment();
这将创建一个主页 Fragment 实例,并调用其 onCreate 方法进行初始化。同样地,当需要创建设置 Fragment 时,可以使用相应的工厂方法:
FragmentFactory factory = new SettingsFragmentFactory();
Fragment fragment = factory.createFragment();
这将创建一个设置 Fragment 实例,并调用其 onCreate 方法进行初始化。通过工厂方法,我们可以方便地创建不同类型的 Fragment 实例,而不需要显式地调用它们的构造方法。
综上所述,工厂模式是一种非常常用的设计模式,它可以将对象的创建过程和使用过程分离开来,提高程序的可扩展性和可维护性。在Android开发中,工厂模式也经常被使用,例如创建数据库的实例或创建网络请求的实例等。通过合理地使用工厂模式,我们可以更加高效地开发出高质量的Android应用程序。
相关文章:
23种设计模式-工厂模式
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需将具体的对象创建逻辑暴露给客户端。在Java中,工厂模式常常用于创建复杂对象或对象的构造过程涉及到多个步骤的情况。 在Android开发中,工厂模式也经常被使用&am…...

Linux操作系统学习(进程等待)
文章目录进程等待进程等待的必要性如何进程等待waiwaitpid验证进程等待 我们知道fork函数可以创建一个子进程,而子进程通常是替父进程完成一些任务,而父进程在fork之后需要通过wait/waitpid等待子进程退出。这就是进程等待 进程等待的必要性 通过获…...
Docker学习(十八)load 和 import 命令的区别
Docker 中有两个命令可以将本地文件系统中的 tar 文件导入到 Docker 中:docker load 和 docker import。尽管它们的作用类似,但它们之间有一些重要的区别。 1.使用方式的不同: docker load 的使用示例: docker load --input tes…...
mysql中的事务
在日常生活中,我们会遇到一个场景,那就是在转账的时候,A有1000块钱,要给B转账500,那么最后的结果是A有500,B有500,但是也有可能出现A没有钱了,B有1000块,或者在转账过程中卡顿,这是不符合逻辑的,那么这个时候就要使用事务来解决问题 事务就是把一堆sql语句打包成一个整体,要么…...
《C++ Primer Plus》第18章:探讨 C++ 新标准(9)
编程练习 下面是一个简短程序的一部分: int main() {using namespace std;// list of double deduced from list contentsauto q average_list ({15.4, 10.7, 9.0});cout << q << endl;// list of int deduced from list contentscout << averag…...

记录一次PWM信号异常问题
问题我使用单片机输出PWM控制机械臂,但是控制过程中,机械臂总是会出现莫名的抽动。利用示波器测试PWM信号,发现信号正常。过程(1)在反复的测试过程中,队友提出,将示波器的地线放在左侧的GND波形…...
简单了解---性能测试
目录 一、什么是性能测试 二、常见的性能测试指标 1、并发 2、响应时间 3、事务 4、点击率 5、吞吐量 6、资源利用率 三、性能测试的分类 1、一般测试 2、负载测试 3、压力测试 4、稳定性测试 四、为什么要做性能测试? 五、影响性能的因素有哪些&…...

1.机器学习笔记第一周
机器学习利用领域: 1:随着网络数据增大,需要搜集用户的数据,做喜好性偏向判断等。 2:只要有数据的,无论是医疗领域,还是基因领域都是需要机器学习来发现数据密码。 3:机器自我学习…...

若依学习(前后端分离版)——启动时发生了啥?(@PostConstruct)(mybatis log free)
我们可以发现若依启动时执行了一些sql我们可以安装一个插件mybatis log free 来更好的进行sql查看 ,安装后需要修改一下若依的日志配置如下查看日志,我们发现执行了三个方法(),分别查询了一些数据。以第二个方法为例子…...
每日十问9c++-内存模型和名称空间
每日十问9c内存模型和名称空间 1.对于下面的情况,应使用哪种存储方案? a.homer 是函数的形参。 b. secret变量由两个文件共享。 c.topsecret 变量由一个文件中的所有函数共享,但对于其他文件来说是隐藏的。 d. beencalled 记录包含它的函数被调用的次数…...

【python】JSON数据类型与Python数据类型之间的转化
注:最后有面试挑战,看看自己掌握了吗 文章目录JSON格式文件JSON格式序列化与反序列化作用JSON常用数据结构键值对的集合值的有序列表JSON数据类型与Python数据类型之间的转化JSON格式和python的区别读写json文件dump 把python 写到json文件load 把json写…...

Spring——什么是事务?传播行为?事务隔离级别有哪些?
思维导图一、什么是事务?多条DML要么同时成功,要么同时失败Transaction(tx)二、事务的四个过程:开启事务(start transaction)执行核心业务代码提交事务(如果核心业务处理过程中没有出…...

【项目实战】使用Feign服务间相互调用,其实OpenFeign也没有想象中那么难嘛
一、Feign介绍 openfeign是一个java的http客户端,用来简化http调用 二、Feign架构(来自官方) Feign由五大部分组成, 由于刚开始接触 feign ,比较关注的 clients 跟 encoders/decoders 三、OKHTTP与Feign之间的关系 在Feign中,Client是一个非常重要的组件,Feign最终…...

tun驱动之ioctl
struct ifreq ifr; ifr.ifr_flags | IFF_TAP | IFF_NO_PI; ioctl(fd, TUNSETIFF, (void *)&ifr); 上面的代码的意思是设置网卡信息,并将tun驱动设置为TAP模式。在TAP模式下,在用户空间下调用open打开/dev/net/tun驱动文件,发送(调用send函…...

[acwing周赛复盘] 第 93 场周赛20230304
[acwing周赛复盘] 第 93 场周赛20230304 一、本周周赛总结二、 4867. 整除数1. 题目描述2. 思路分析3. 代码实现三、 4868. 数字替换1. 题目描述2. 思路分析3. 代码实现四、4869. 异或值1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 彩笔了,只A…...
NOIP2022 T4 比赛
P8868 [NOIP2022] 比赛 题目大意 有两个长度为nnn的序列aaa和bbb,有qqq次询问,每次询问给出l,rl,rl,r,求 ∑ilr∑ji1r(maxkijak)(maxlijbl)\sum\limits_{il}^r\sum\limits_{ji1}^r(\max\limits_{ki}^ja_k)\times(\max\limits_{li}^jb_l…...

计算机组成原理
目录 ❤ 控制器 ❤ 运算器 ❤ 控制器运算器(计算机的中央处理器CPU) ❤ 存储器 内存(主存) 外存 内存和外村的区别 ❤ 输入设备 ❤ 输出设备 ❤ 适配器 ❤ 总线 ❤ 启动计算机的流程 ❤ 机械硬盘 ❤ 固态硬盘 python从小白到总裁完整教程目录:https://b…...
1. 命名规范
1. 命名规范 成绩10开启时间2021年09月17日 星期五 18:00折扣0.8折扣时间2021年11月6日 星期六 00:00允许迟交否关闭时间2021年11月21日 星期日 00:00 家有家法,行有行规。在家有家的规矩,入行有行的规矩。我们计算机一行就有一个命名的规矩,…...

论文投稿指南——中文核心期刊推荐(新闻事业)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
【Linux】工具(4)——make/Makefile
本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile📌make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make&…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...