Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-06-28:谈一谈单例模式,建造者模式,工厂模式的使用场景?如何合理选择?

MoJieBlog opened this issue · comments

2019-06-28:谈一谈单例模式,建造者模式,工厂模式的使用场景?如何合理选择?

抛砖引玉

单例模式 顾名思义,只有一个实例,一般用来网络请求的实例

建造者模式,不是很熟悉,AlertDialog的创建使用的是这个

工厂模式,批量生产相似的产品,可用来设计Activity的基类

  • 单例模式,一般是指将消耗内存、属性和对象支持全局公用的对象,应该设置为单例模式,如持久化处理(网络、文件等)
  • 建造者模式,一般见于开发的框架或者属性时可以直接链式设置属性,比如我们看到的AlertDialog,一般用在某些辅助类(如BRVAHBaseViewHolder)或者开发的框架的时候方便连续设置多个属性和调用多个方法。
  • 工厂模式,一般用于业务的实体创建,在创建的过程中考虑到后期的扩展。在Android源码中比较常见的有BitmapFactory`LayoutInflater.Factory,在实体编码的过程中,比如BRVAH的多布局,如果数据类型比较多或者后期需要扩展,则可以通过工厂布局的方式,将实现MultiItemEntity `接口的实体通过工厂模式创建:
object MultiItemEntityFactory{
    val TEXT = 1
    val IMG = 2
    val TEXT_IMG = 3

    fun createBean(type:Int): MultiItemEntity {
        when(type){
            TEXT -> return BeanA()
            IMG -> return BeanB()
            TEXT_IMG -> return BeanC()
            else -> return BeanA()
        }
    }
}
class MultipleItemQuickAdapter(data: List<*>) : BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder>(data) {

    init {
        addItemType(MultipleItem.TEXT, R.layout.text_view)
        addItemType(MultipleItem.IMG, R.layout.image_view)
    }

    override fun convert(helper: BaseViewHolder, item: MultipleItem) {
        ...
    }

}

  1. 单例模式:保证全局只有一个实例,如网络请求
  2. 建造者模式:用于需要设置比较多的属性可以用直接链式,如AlerDialog
  3. 工厂模式:用于业务的实体类创建,易于扩展,如BitMapFactory

简单工厂:一工厂 多产品;
工厂方法:多工厂 多产品;