工厂模式也是为了构建一个新的对象,它是创建型模式的一种。

Android源码设计模式——Build模式(应用:AlertDialog源码分析)

上述是之前的Build模式,也是创建型模式一种,不懂的小伙伴可以回看下上篇博客。

工厂模式的定义

自我叙述:定义一个抽象产品类,然后继承该抽象类形成很多的子类,在子类相当于是个:成品的产品,也就是我们真正要构建的产品。在定义一个抽象类,该抽象类内部:创建子类的公共方法定义。在定义真正的工厂实现类,继承自该抽象类。

由此看下工厂模式的UML图:

UML图

上图,分四块:

ABS Product —— 产品抽象类

ConcreteProduct —— 产品实现类

Abs Factory —— 抽象工厂类

ConcreteFactory —— 工厂实现类

根据上述代码,写一个例子感受下,还是以我们的小汽车为例:

Abs Product 小汽车的框架

不管什么小汽车,他们都需要:轮子,发动机,车灯等公用零件

public abstract class AbsCar {

protected String wheel; //轮子

protected String engine; //发动机

protected String lampBulb; //车灯

// ........等等公共零件

protected abstract void setWheel(String wheel);

protected abstract void setEngine(String engine);

protected abstract void setLampBulb(String lampBulb);

}

具体生产的小汽车

根据公共的生产小汽车标准,我们演化出了众多类型的车,比如:奔驰,丰田。

public class ConcreteBenzCar extends AbsCar {

private final static String TAG = "奔驰汽车";

@Override

protected void setWheel(String wheel) {

Log.e(TAG, "构造轮子");

}

@Override

protected void setEngine(String engine) {

Log.e(TAG, "构造发动机");

}

@Override

protected void setLampBulb(String lampBulb) {

Log.e(TAG, "构造车灯");

}

}

public class ConcreteToyotaCar extends AbsCar {

private final static String TAG = "丰田汽车";

@Override

protected void setWheel(String wheel) {

Log.e(TAG, "构造轮子");

}

@Override

protected void setEngine(String engine) {

Log.e(TAG, "构造发动机");

}

@Override

protected void setLampBulb(String lampBulb) {

Log.e(TAG, "构造车灯");

}

}

我们构造了两种类型的小汽车:奔驰和丰田。同理,也可以以抽象类为基准,生产出各种各样类型的小汽车。

构建小汽车的工厂标准

由于我们生成小汽车是需要工厂的,不同的汽车工厂标准都是一样的:生产出汽车。

public abstract class AbsFactory {

public abstract T createProduct(Class mClass);

}

现在创建工厂的标准有了,该创建工厂了

创建工厂实现类

public class ConcreteCarFactory extends AbsFactory {

//***********************方法1*************************//

public ConcreteBenzCar createBenz() {

ConcreteBenzCar car = new ConcreteBenzCar();

//TODO: 构造

return car;

}

public ConcreteToyotaCar createToyota() {

ConcreteToyotaCar car = new ConcreteToyotaCar();

//TODO:构造

return car;

}

//***********************方法2*************************//

@Override

public T createProduct(Class mClass) {

T object = null;

try {

object = (T) Class.forName(mClass.getName()).newInstance();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

}

return object;

}

}

上文定义了两种方法

直接创建产品

通过反射创建产品

实际上关于使用工厂模式,我觉得还是得根据项目实际出发的。

有的人说:Activity的onCreate方法的调用就属于工厂模式,但是我是在看不出来。关于Activity的启动流程分析博客:

Android进阶3:Activity源码分析(1) —— Activity启动流程(8.0)

android工厂模式源码,Android源码设计模式——工厂模式相关推荐

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  2. 13. 星际争霸之php设计模式--正面模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  3. 12. 星际争霸之php设计模式--模板模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  4. [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境 ...

  5. 15. 星际争霸之php设计模式--策略模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  6. android 夜间模式源码,Android Support Library 之 夜间模式

    前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见博客:http://wuxiaolong.me/2015/08/19/ ...

  7. Android 11源码 Framework修改默认usb连接模式为MTP模式

    Android 11源码 Framework修改默认usb连接模式为MTP模式 Android 11源码 Framework修改默认usb连接模式为MTP模式 修改Framework层源码 编译修改后 ...

  8. android摩拜地图开发,android沉浸状态栏实现、地图多线路规划、Retrofit+RxJava+Jsoup+Mvp模式资讯类App等源码...

    Android精选源码 Android优质博客 Android各种沉浸式状态栏实现源码http://www.apkbus.com/thread-598927-1-1.html1.引入dependenc ...

  9. Android Jetpack组件之 Paging使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. 动态引入js只能生效一次_干货丨动态插入的script脚本执行时间
  2. openSession()和getCurremtSession()的区别
  3. 利用gulp,当引入文件改动时,版本号自动更新~
  4. 周期均方根和有效值的区别_茅台王子酒和迎宾酒的区别是什么?
  5. 三菱5uplc伺服电机指令_PLC中伺服控制指令的应用
  6. jQuery conflict with other Liberary
  7. 【Pix4d精品教程】打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法
  8. ROBOGUIDE软件:FANUC机器人弧焊焊接系统配置与虚拟仿真
  9. 大数据24小时:九章云极宣布获近亿元B轮融资,我国成功研发智能辅助驾驶系统
  10. 江西省2021年工业互联网安全技术技能大赛
  11. Vivado与Modelsim联合仿真配置【图文并茂】
  12. 约瑟夫环代码展示,以及理解约瑟夫环
  13. 【Android 自定义控件】2.画布的基础使用
  14. 微信小程序原生表格组件
  15. c++中static变量的存储duration
  16. UE4 C++入门之路1-C++和蓝图的关系和介绍
  17. 从 Azure Databricks 访问 Azure Blob 存储
  18. python pty模块 - 作用1 - 虚拟一个串口
  19. Merkle Tree 实现细节及(不)存在性证明
  20. 传感器 esp8266_使用esp8266作为I2C传感器的主机

热门文章

  1. python调阿里OCR_增值税发票,定额发票,混贴发票,表格_识别,处理数据写入excel
  2. Linux操作系统——面试题-(腾讯,百度,美团,滴滴)
  3. python星号三角形
  4. iOS之适配苹果Universal Links 和升级友盟的QQ和微信分享艰难之路
  5. 浙江大学-数据结构之第一讲 基本概念
  6. python中参数传递的方法
  7. 惠普的Spectre Ultrabook的可以区分具备NFC,无线音频
  8. 应届毕业生就不能当总监么?
  9. npm ERR gyp ERR cwd 文件路径\node-sass错误启动不了
  10. 计算机游戏纸牌技巧,扑克牌游戏“算24”的程序解法