https://blog.csdn.net/Agg_bin/article/details/104331797

    工厂方法设计模式工厂方法设计模式,它的核心作用就是通过一个工厂隐藏对象实例的创建逻辑,而不需要暴露给客户端,实现解耦。

    典型的使用场景就是当拥有一个父类与多个子类的时候,我们可以通过这种模式来创建子类对象。比如下面的业务场景:一个电脑加工厂,同时生产个人电脑和服务器主机。

    1. package com.agg.kotlinapplication
    2. interface Computer {
    3. val cpu: String
    4. companion object Factory {
    5. operator fun invoke(type: ComputerType): Computer {
    6. return when (type) {
    7. ComputerType.PC -> PC()
    8. ComputerType.Server -> Server()
    9. }
    10. }
    11. }
    12. }
    13. class PC(override val cpu: String = "Core") : Computer
    14. class Server(override val cpu: String = "Xeon") : Computer
    15. enum class ComputerType {
    16. PC, Server
    17. }
    18. fun main(args: Array<String>) {
    19. println(Computer.Factory(ComputerType.PC).cpu) // Core
    20. }

    companion object Factory:通过伴生对象创建静态工厂方法 ,方便调用。

    operator fun invoke:通过运算符重载,简化方法的调用。注:()就是重载过的invoke方法。

    抽象工厂设计模式
    抽象工厂设计模式,为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

    在上面的工厂方法设计模式中,我们已经很好的解决了电脑厂商生产服务器、PC机的问题,但是如果现在有好几个不同的电脑品牌,如Dell、Asus、Acer,那么就有必要在增加一个工厂类,此时可以采用抽象工厂设计模式,代码如下:

    1. package com.agg.kotlinapplication
    2. interface Computer
    3. class Dell : Computer
    4. class Asus : Computer
    5. class Acer : Computer
    6. class DellFactory : AbstractFactory() {
    7. override fun produce() = Dell()
    8. }
    9. class AsusFactory : AbstractFactory() {
    10. override fun produce() = Asus()
    11. }
    12. class AcerFactory : AbstractFactory() {
    13. override fun produce() = Acer()
    14. }
    15. abstract class AbstractFactory {
    16. abstract fun produce(): Computer
    17. companion object {
    18. inline operator fun <reified T : Computer> invoke(): AbstractFactory =
    19. when (T::class) {
    20. Dell::class -> DellFactory()
    21. Asus::class -> AsusFactory()
    22. Acer::class -> AcerFactory()
    23. else -> throw IllegalArgumentException()
    24. }
    25. }
    26. }
    27. fun main(args: Array<String>) {
    28. println(AbstractFactory<Dell>().produce()) // com.agg.kotlinapplication.Dell@f6f4d33
    29. }

    inline operator fun invoke():通过将invoke方法用inline定义为内联函数,进而可以引用reified关键字,使用具体化参数类型的语法特性。

    Kotlin和Java一样,由于运行时的类型擦除,并不能直接获取一个参数的类型,然而内联函数会直接在字节码中生成相应的函数体实现,这种情况下我们就可以获取参数的具体类型。

    参考:【Kotlin核心编程-水滴技术团队】
    ————————————————
    版权声明:本文为CSDN博主「Swuagg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Agg_bin/article/details/104331797