Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
- 松耦合,调用方只需与工厂类交互,无需关心实例怎么创建的。
- 扩展性强,只需新增一个实现类和修改工厂方法即可,这也算缺点的一方面。
/***工厂模式的生产*/ public void factoryMode(){try{Iphone androidPhone=PhoneGeneratorFactory.createPhone(PhoneGeneratorFactory.GENERATE_ANDROID); }catch (Exception e){} }
/**正常流程*/ public void NomalMode(){try{Iphone android, ios, bb; IGenerator androidGenerator, iosGenerator, bbGenerator; androidGenerator = new AndroidGenerator(); iosGenerator = new IosGenerators(); bbGenerator = new WindowGenerator(); android = androidGenerator.generatePhone(PhoneGeneratorFactory.GENERATE_ANDROID); ios = iosGenerator.generatePhone(PhoneGeneratorFactory.GENERATE_IOS); bb = bbGenerator.generatePhone(PhoneGeneratorFactory.GENERATE_Window); android.getOS(); ios.getOS(); bb.getOS(); }catch (Exception e){} }
/** * 静态方法 * 只需要知道要生产什么型号的手机:苹果手机 * * * @param flag * @return * @throws Exception */ public static Iphone createPhone(String flag) throws Exception {Iphone iPhone = null; switch (flag){case GENERATE_ANDROID:iPhone = new AndroidPhone(); break; case GENERATE_IOS:iPhone = new IosPhone(); break; case GENERATE_Window:iPhone = new WindowPhone(); break; default:throw new Exception("UNDEFINED FLAG"); }return iPhone; }/** * 静态方法 * 只需要知道要生产什么型号的手机:苹果手机 * 升级版 * * @param flag * @return * @throws Exception */ public static Iphone createPhonePlus(String flag) throws Exception {Iphone iPhone = null; switch (flag){case GENERATE_ANDROID:iPhone = new AndroidGenerator().generatePhone(GENERATE_ANDROID); break; case GENERATE_IOS:iPhone = new IosGenerators().generatePhone(GENERATE_IOS); break; case GENERATE_Window:iPhone = new WindowGenerator().generatePhone(GENERATE_Window); break; default:throw new Exception("UNDEFINED FLAG"); }return iPhone; }//抽象类可以只实现抽象类的部分方法 /**如果这个抽象类继承了别的抽象类,那么可以不覆盖抽象方法。 因为:这个抽象类也是抽象的,没办法实现方法体。*/ //有2种方式,实现类要实现抽象类的所有方法 abstract class PhoneGeneratorAbstract extends IGenerator {public <T extends Iphone>T generatePhone(Class<T> clazz) throws Exception {Iphone iPhone = null; iPhone = (Iphone) Class.forName(clazz.getName()).newInstance(); return (T)iPhone; }}//有2种方式,实现类要实现抽象类的所有方法 class PhoneGenerator extends IGenerator {public <T extends Iphone>T generatePhone(Class<T> clazz) throws Exception {Iphone iPhone = null; iPhone = (Iphone) Class.forName(clazz.getName()).newInstance(); return (T)iPhone; }@Override public Iphone generatePhone(String flag) throws Exception {return null; }}
/** * Created by Administrator on 2017/9/12. * 不同的工厂生产不同的产品 */ public class AndroidGenerator extends IGenerator {@Override public Iphone generatePhone(String flag) throws Exception {return new AndroidPhone(); }}
public class IosGenerators extends IGenerator {@Override public Iphone generatePhone(String flag) throws Exception {return new IosPhone(); }}
public class WindowGenerator extends IGenerator {@Override public Iphone generatePhone(String flag) throws Exception {return new WindowPhone(); } }
public abstract class IGenerator {public abstract Iphone generatePhone(String flag) throws Exception; /**泛型,抽象接口*/ public abstract <T extends Iphone>T generatePhone(Class<T> clazz) throws Exception; }
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory相关推荐
- Android 9(P)之init进程启动源码分析指南之一
Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...
- Android 9 (P)之init进程启动源码分析指南之三
Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...
- Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程
前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...
- Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程
Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...
- 设计模式之工厂方法模式---factory method
模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 解密android日志xlog,XLog 详解及源码分析
一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...
- 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析
文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...
- java/android 设计模式学习笔记(3)---工厂方法模式
这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...
最新文章
- 源码阅读:SDWebImage(六)——SDWebImageCoderHelper
- redis日志_「漫画」谈谈Redis持久化
- ATTCK框架简介 已知攻击技术汇总
- 《研磨设计模式》chap12 观察者模式observer(3)例子
- linux lvm 系统快照,系统运维|在 LVM中 录制逻辑卷快照并恢复(第三部分)
- 无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang
- 第 9 章 MybatisX 快速开发插件
- Pthon入门--range()函数
- 怎样在计算机上注册dll文件,win10如何注册dll文件_win10系统dll文件怎样安装
- 【精读笔记】JavaScript高级程序设计 第3章 语言基础
- SpringBoot统一返回处理出现cannot be cast to java.lang.String异常
- [转]奇虎360黑匣子之谜:暗藏后门盗取用户隐私
- Java新手教程从入门到放弃从入门到精通(3)
- jt2go嵌入html控件,JT2Go(JT文件阅读器) 免费版v11.2
- mysql码表是什么意思_什么是码表,什么是维度表?
- 嵌入式 C 语言中三块难啃的硬骨头
- Python day3 Python中raw字符串与多行字符串
- 线束测试仪在无人机领域中的应用
- 基于CPLD和LVPECL门电路的脉宽可调窄脉冲信号发生器设计
- 高清还原图片(利用网站在线还原,最后用ps进一步优化)