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

前言

工厂方式模式是创建型设计模式

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

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

UML类图:
Android设计模式详解之工厂方法模式_第1张图片
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的子类,这个方法满足让子类决定实例化哪个类,故而采用的是工厂模式。

总结

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

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

结语

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

你可能感兴趣的:(玩转设计模式,android,设计模式,工厂方法模式)