列子;不同的吃厂商需要不同的UI,进行打包
一般是结合泛型来用。
  • 松耦合,调用方只需与工厂类交互,无需关心实例怎么创建的。
  • 扩展性强,只需新增一个实现类和修改工厂方法即可,这也算缺点的一方面。
简单方式:
http://www.cnblogs.com/hehesong/p/5306914.html
工厂方法
http://blog.csdn.net/l2show/article/details/47704005
 首先先介绍一下标准的工厂方法模式,不带任何的变种.以工厂生产不同操作系统的手机为例.
/***工厂模式的生产*/
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;
}
源码:不知道为什么上传不了
总结:
1.一个接口封装方法
2.多个实现类继承借口,重写接口里面的方法
3.一个工具类,封装静态方法,可以调用
好处:不需要知道具体的过程,只需要给一个型号,工厂就自动生产(客户端不再创建对象,而是把创建对象的职责交给了具体的工厂去创建)
降低了对象之间的耦合度,代码结构清晰,对调用者隐藏了产品的生产过程,生产过程改变后,调用者不用做什么改变,易于修改。
BitMapFactory:
线程池:
Excutors里面的就是工程模式,工厂方法提供的5种不同的线程池
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}
 

Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory相关推荐

  1. Android 9(P)之init进程启动源码分析指南之一

         Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  2. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  3. Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程

    前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...

  4. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

    Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...

  5. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

  6. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  7. 解密android日志xlog,XLog 详解及源码分析

    一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...

  8. 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析

    文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...

  9. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  10. 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )

    文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...

最新文章

  1. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper
  2. redis日志_「漫画」谈谈Redis持久化
  3. ATTCK框架简介 已知攻击技术汇总
  4. 《研磨设计模式》chap12 观察者模式observer(3)例子
  5. linux lvm 系统快照,系统运维|在 LVM中 录制逻辑卷快照并恢复(第三部分)
  6. 无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang
  7. 第 9 章 MybatisX 快速开发插件
  8. Pthon入门--range()函数
  9. 怎样在计算机上注册dll文件,win10如何注册dll文件_win10系统dll文件怎样安装
  10. 【精读笔记】JavaScript高级程序设计 第3章 语言基础
  11. SpringBoot统一返回处理出现cannot be cast to java.lang.String异常
  12. [转]奇虎360黑匣子之谜:暗藏后门盗取用户隐私
  13. Java新手教程从入门到放弃从入门到精通(3)
  14. jt2go嵌入html控件,JT2Go(JT文件阅读器) 免费版v11.2
  15. mysql码表是什么意思_什么是码表,什么是维度表?
  16. 嵌入式 C 语言中三块难啃的硬骨头
  17. Python day3 Python中raw字符串与多行字符串
  18. 线束测试仪在无人机领域中的应用
  19. 基于CPLD和LVPECL门电路的脉宽可调窄脉冲信号发生器设计
  20. 高清还原图片(利用网站在线还原,最后用ps进一步优化)

热门文章

  1. js 获取字符长度(英文1,中文2)
  2. 开篇:内容提要 (《蓝调口琴指南》名作拙译)
  3. #TCP你学得会# Wireshark中的TCP Spurious Retransmission
  4. ubuntu16.04 联想拯救者y7000笔记本电脑安装1060显卡驱动,及ubuntu16.04更新内核
  5. 电商系统购物车流程图
  6. 如何有效地卸载office
  7. js传递参数时类型错误
  8. python可以手眼定标吗_北京高碑店小学生Python编程周末班
  9. Android 深色模式适配
  10. 发现了个神奇的图片压缩工具