Android设计模式--工厂模式

一,定义

工厂模式与Android 设计模式--单例模式-CSDN博客,Android设计模式--Builder建造者模式-CSDN博客,Android设计模式--原型模式-CSDN博客 一样,都是创建型设计模式。

工厂模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类

二,使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

三,工厂模式简单使用

工厂模式主要分为四个模块:

1,抽象工厂,其为工厂模式的核心

2,具体工厂,其实现了具体的业务逻辑

3,抽象产品,是工厂方法模式所创建的产品的父类

4,具体产品,为实现抽象产品的某个具体产品的对象

下面来看一个简单的案例

某手机工厂可以生产三种手机,分别是手机A,手机B,手机C。

创建一个抽象的产品接口:

public interface Phone {void call();
}

创建具体的产品类:

public class PhoneA implements Phone{private static final String TAG = "phoneA";@Overridepublic void call() {Log.d(TAG,"我是手机A");}
}
public class PhoneB implements Phone{private static final String TAG = "PhoneB";@Overridepublic void call() {Log.d(TAG,"我是手机B");}
}

创建一个抽象的工厂接口:

public interface Factory {Phone createPhone();
}

创建具体的工厂类:

public class FactoryPhoneA implements Factory{@Overridepublic PhoneA createPhone() {return new PhoneA();}
}
public class FactoryPhoneB implements Factory{@Overridepublic PhoneB createPhone() {return new PhoneB();}
}

使用:

FactoryPhoneA factoryA =new FactoryPhoneA();
PhoneA phone =factoryA.createPhone();
phone.call();
FactoryPhoneB factoryB=new FactoryPhoneB();
PhoneB phoneB =factoryB.createPhone();
phoneB.call();

输出:

四,使用反射的工厂模式

还是上面的例子

抽象工厂接口可以改造为:

public interface Factory<T extends Phone> {T createPhone(Class<T> tClass);
}

具体的工厂类改造为:

public class PhoneFactory<T extends Phone> implements Factory<T>{@Overridepublic T createPhone(Class<T> tClass) {Phone phone =null;try {phone = (Phone) Class.forName(tClass.getName()).newInstance();} catch (Exception e) {throw new RuntimeException(e);}return (T) phone;}
}

这样在使用的时候,就class来动态的加载对象:

PhoneFactory phoneFactory =new PhoneFactory();
Phone phone1 = phoneFactory.createPhone(PhoneA.class);
phone1.call();
Phone phone2 = phoneFactory.createPhone(PhoneB.class);
phone2.call();

输出:

五,总结

总的来说,工厂模式是一个很好的设计模式,可以很优雅的创建对象,也符合设计原则。

缺点就是每增加一个新的产品,就会增加一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,就没有必要非要去使用工厂模式。

参考文献:Android源码设计模式解析与实战第二版

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm pro v2023.2.4(Python编辑开发)

PyCharm2023是一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门为Python编程语言设计。以下是PyCharm2023的一些主要功能和特点&#xff1a; 代码编辑器&#xff1a;PyCharm2023提供了一个功能强大的代码编辑器&#xff0c;支持语法高亮、自动补全、代码调试、版…

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报 文章目录 导入库初始化设置MQTT注册回调订阅发布功能开启服务发送消息函数打包调用测试效果附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from TenCentYun import TX…

无标题栏的Qt子窗体在父窗体中停靠时,如何做到严丝合缝

目录 1. 问题的提出 2. 一般实现 3. 加强版 1. 问题的提出 由于业务的要求&#xff0c;需要从父窗体弹出一个子窗体&#xff0c;该子窗体无标题栏&#xff0c;且该子窗体要停靠到父窗体右下角。这个看似很容易的问题&#xff0c;细研起来其实不容易&#xff01; 2. 一般实现…

VScode+python开发,多个解释器切换问题

内容&#xff1a;主要VScode使用多个解释器 环境准备 VScode编辑器&#xff0c;两个版本python解释器 python3.7.2 python3.11.6 问题&#xff1a; 目前我们的电脑安装了python3.7.2、python3.11.6两个解释器&#xff0c;在vscode编辑器中&#xff0c;无法切换解释器使用如…

​软考-高级-系统架构设计师教程(清华第2版)【第6章 数据库设计基础知识(234~262)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第6章 数据库设计基础知识&#xff08;234~262&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

简单实现,在nodejs中简单使用kafka

什么是 Kafka Kafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的基于发布订阅模式的消息引擎系统。 Kafka 的基本术语 消息&#xff1a;Kafka 中的…

Django 的国际化与本地化详解

概要 随着全球化的发展&#xff0c;为 Web 应用提供多语言支持变得日益重要。Django 作为一个功能强大的 Web 框架&#xff0c;提供了一套完整的国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;工具&#xff0c;使得开发多语言应用变得简单。本文将详…

【软考篇】中级软件设计师 第一部分

中级软件设计师 第一部分 一. 计算机硬件1.1 运算器1.2 控制器 二. 数据的进制2.1 数的表示2.2 数的编码方式2.2.1 数据运算用补码运算 2.3 码制的取值范围2.3.1 例题一 三. 浮点的表示3.1 浮点数运算 四. 运算符五. 校验码5.1 海明校验码 六. 计算机指令6.1 计算机体系结构分类…

Android Matrix的使用详解(通过矩阵获取到图片缩放比例和角度)

网上查了好久相关的资料&#xff0c;都没有明确的答案。最终通过多次测试结果&#xff0c;结合安卓定义的矩阵含义&#xff0c;推算出来矩阵的数学含义以及相关的计算公式 1.获取Matrix矩阵&#xff1a; Matrix matrix new Matrix(); float[] matrixValues new float[9]; …

VSCode 好用的插件分享

文章目录 Introlistcode runner 【在文本编辑器中编辑好各类语言的源代码&#xff0c;然后一键运行】gitlens - 【git提交信息即时查看&#xff0c;类似IDEA中的 show annotation】还有更多&#xff0c;会日常补充。 Intro 大四毕业前&#xff0c;我只有一台dell latitude 455…

自定义Graph Component:1.2-其它Tokenizer具体实现

本文主要介绍了Rasa中相关Tokenizer的具体实现&#xff0c;包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer&#xff0c;后者包括BertTokenizer和AnotherWhitespaceTokenizer。 一.JiebaTokenizer   Ji…

人工智能基础_机器学习027_L2正则化_岭回归_非稀疏性_原理解读_公式推导---人工智能工作笔记0067

然后我们再来看一下岭回归,也就是第二范数对吧, 他的公式,平方以后,加和然后开平方.L2的公式是 可以看到L2公式,也是有个阿尔法,惩罚项对吧. 可以看到因为L2带有平方,所以他的图形是个圆形 我们可以把L2范数,进行画出来看看 这里我们先看L2的公式,这里我们让 这个公式写成1 …