04_简单工厂模式

一、产品类

package com.study.simple_factory

/**
 * 定义手机接口
 */
interface IPhone {
    
    
    /**
     * 打电话
     */
    fun call()

    /**
     * 发送短信
     */
    fun sendMsg()

    /**
     * 玩游戏
     */
    fun playGame()
}
package com.study.simple_factory

/**
 * 华为手机
 */
class HuaWeiPhoneImpl : IPhone {
    
    
    override fun call() {
    
    
        println("华为手机打电话...")
    }

    override fun sendMsg() {
    
    
        println("华为手机发短信...")
    }

    override fun playGame() {
    
    
        println("华为手机玩游戏...")
    }
}
package com.study.simple_factory

/**
 * 小米手机
 */
class MiPhoneImpl : IPhone {
    
    
    override fun call() {
    
    
        println("XiaoMi手机打电话...")
    }

    override fun sendMsg() {
    
    
        println("XiaoMi手机发短信...")
    }

    override fun playGame() {
    
    
        println("XiaoMi手机玩游戏...")
    }

}
package com.study.simple_factory

/**
 * Vivo手机
 */
class VivoPhoneImpl : IPhone {
    
    
    override fun call() {
    
    
        println("Vivo手机打电话...")
    }

    override fun sendMsg() {
    
    
        println("Vivo手机发短信...")
    }

    override fun playGame() {
    
    
        println("Vivo手机玩游戏...")
    }

}

二、工厂类

package com.study.simple_factory


/**

 * 手机工厂
 */
object PhoneFactory{
    
    

    // 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。无法形成基于继承的等级结构。
    fun createPhone(phoneEnum: PhoneEnum) = when (phoneEnum) {
    
    
        PhoneEnum.HUAWEI -> HuaWeiPhoneImpl()
        PhoneEnum.VIVO -> VivoPhoneImpl()
        PhoneEnum.MI -> MiPhoneImpl()
    }
}

三、主程序调用

package com.study.simple_factory

/**
 * 
    定义:由一个工厂对象决定创建出哪一种产品类的实例
    类型:创建型,但不属于GOF23种设计模式
    
    适用场景:
    工厂类负责创建的对象比较少
    客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
    
    优点:
    只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其创建细节
    
    缺点:
    工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。无法形成基于继承的等级结构。
 */

/**
 * 用户端
 */
fun main(args: Array<String>) {
    
    
    //    客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
    val miPhone = PhoneFactory.createPhone(PhoneEnum.MI)
    val vivoPhone = PhoneFactory.createPhone(PhoneEnum.VIVO)
    val huaweiPhone = PhoneFactory.createPhone(PhoneEnum.HUAWEI)

    miPhone.call()
    vivoPhone.call()
    huaweiPhone.call()
}

四、运行结果

猜你喜欢

转载自blog.csdn.net/Duckdan/article/details/109683171
04_