Android设计模式详解之工厂方法模式

  • Post author:
  • Post category:其他




前言

工厂方式模式是

创建型设计模式


定义:

定义一个用于创建对象的接口,让子类决定实例化哪个类。


使用场景:

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


UML类图:


工厂方法模式UML


Product:

抽象产品;


ConcreteProduct:

具体产品;


Factory:

抽象工厂;


ConcreteFactory:

具体工厂;



实现实例

我们以

数据存储方式

举例,实际开发中数据存储方式可以有

文件存储



内存缓存

等等,这里我们就使用工厂方法模式来实现:



简单工厂

  • IOHandler,定义存储规则;
interface IOHandler {
   /**
    * 添加
    */
   fun add(key: String, value: String)

   /**
    * 移除
    */
   fun remove(key: String)

   /**
    * 修改
    */
   fun update(key: String, value: String)


   /**
    * 查找
    */
   fun query(key: String): String

}
  • FileHandler,文件存储方式
class FileHandler : IOHandler {
    override fun add(key: String, value: String) {

    }

    override fun remove(key: String) {

    }

    override fun update(key: String, value: String) {

    }

    override fun query(key: String): String {
        return ""
    }
}
  • MemoryHandler,内存存储方式
class MemoryHandler : IOHandler {
    override fun add(key: String, value: String) {

    }

    override fun remove(key: String) {

    }

    override fun update(key: String, value: String) {

    }

    override fun query(key: String): String {
        return ""
    }
}
  • IOHandlerFactory,简单工厂,用于产品生产;
object IOHandlerFactory {
    enum class TYPE {
        MEMORY, FILE
    }

    fun createIOHandler(type: TYPE): IOHandler {
        return when (type) {
            TYPE.MEMORY -> MemoryHandler()
            TYPE.FILE -> FileHandler()
        }
    }
}
  • 测试类,调用简单工厂进行产品生产;
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        val memoryIOHandler = IOHandlerFactory.createIOHandler(IOHandlerFactory.TYPE.MEMORY)
        memoryIOHandler.add("key", "value")
    }
}



工厂方法模式

工厂方法模式相较于简单工厂新增

工厂接口

以及

具体工厂创建类

;

  • IOFactory,工厂接口;
interface IOFactory {
    fun createIOHandler(): IOHandler
}
  • FileIOFactory,文件存储具体工厂类;
/**
 * 文件存储具体工厂
 */
class FileIOFactory : IOFactory {
    override fun createIOHandler(): IOHandler {
        return FileHandler()
    }
}
  • MemoryIOFactory,内存存储具体工厂类;
/**
 * 内存具体工厂
 */
class MemoryIOFactory : IOFactory {
    override fun createIOHandler(): IOHandler {
        return MemoryHandler()
    }
}
  • 测试类,通过工厂方法进行产品生产;
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        val fileFactory = FileIOFactory().createIOHandler()
        fileFactory.add("key", "value")

        val memoryFactory = MemoryIOFactory().createIOHandler()
        memoryFactory.add("key", "value")
    }
}



Android中的工厂模式


  • setContentView(View view)

    方法

    为什么说这个方式使用到了工厂模式呢?我们这么调用:


    setContentView(LinearLayout(this))

    ,我们知道

    LinearLayout

    继承于ViewGroup,而ViewGroup又是View的子类,这个方法满足让子类决定实例化哪个类,故而采用的是工厂模式。



总结


优点:

对象的创建统一交给工厂去生成,有良好的封装性,同时也做到了解耦,也满足最少知识原则;


缺点:

每次添加新的产品都需要新增产品类和对应的工厂类,会导致类结构复杂化,因此需要结合实际情况去评估是否使用工厂模式。



结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )



版权声明:本文为a734474820原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。