06_抽象工厂模式

一、工厂类

package com.study.abstract_factory.factory

import com.study.abstract_factory.product.PhoneType

/**
 * 工厂接口
 */
interface IFactory {
    
    
    fun <T> createPhone(phoneType: PhoneType): T
}
package com.study.abstract_factory.factory

import com.study.abstract_factory.product.PhoneType

/**
 * 手机工厂
 */
abstract class PhoneFactory : IFactory {
    
    
    override fun <T> createPhone(phoneType: PhoneType) = Class.forName(phoneType.className).newInstance() as T
}
package com.study.abstract_factory.factory

import com.study.abstract_factory.product.GameHuaWeiPhone
import com.study.abstract_factory.product.PhoneType
import com.study.abstract_factory.product.PowerHuaWeiPhone

/**
 * 华为工厂实现类
 */
object HuaWeiPhoneFactory : PhoneFactory() {
    
    

    fun createPowerPhone() = createPhone<PowerHuaWeiPhone>(PhoneType.HUAWEIPOWER)

    fun createGamePhone() = createPhone<GameHuaWeiPhone>(PhoneType.HUAWEIGAME)
}
package com.study.abstract_factory.factory

import com.study.abstract_factory.product.*

/**
 * 华为工厂实现类
 */
object VivoPhoneFactory : PhoneFactory() {
    
    

    fun createPowerPhone() = createPhone<PowerVivoPhone>(PhoneType.VIVOPOWER)

    fun createGamePhone() = createPhone<GameVivoPhone>(PhoneType.VIVOGAME)
}

二、产品类

package com.study.abstract_factory.product

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

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

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

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

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

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

    /**
     * 特殊功能
     */
    abstract fun specialOptions()
}
package com.study.abstract_factory.product

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

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

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

    /**
     * 特殊功能
     */
    abstract fun specialOptions()
}
package com.study.abstract_factory.product

/**
 * 游戏华为手机
 */
class GameHuaWeiPhone : AbstractHuaWeiPhone() {
    
    
    override fun specialOptions() {
    
    
        println("华为游戏手机...")
    }
}
package com.study.abstract_factory.product

/**
 * 游戏vivo手机
 */
class GameVivoPhone : AbstractVivoPhone() {
    
    
    override fun specialOptions() {
    
    
        println("Vivo游戏手机...")
    }
}
package com.study.abstract_factory.product

/**
 * 电量坚强华为手机
 */
class PowerHuaWeiPhone : AbstractHuaWeiPhone() {
    
    
    override fun specialOptions() {
    
    
        println("华为电量手机...")
    }
}
package com.study.abstract_factory.product

/**
 * 电量坚强vivo手机
 */
class PowerVivoPhone : AbstractVivoPhone() {
    
    
    override fun specialOptions() {
    
    
        println("Vivo电量手机...")
    }
}

三、主程序调用

package com.study.abstract_factory

import com.study.abstract_factory.factory.HuaWeiPhoneFactory
import com.study.abstract_factory.factory.VivoPhoneFactory

/*
定义:
关注产品族(例如:格力生产空调、冰箱、洗衣机等电器,格力的空调、冰箱、洗衣机就属于产品族),
不太关注产品等级结构(例如:美的生产空调、格力生产空调,美的空调、格力空调就属于同一产品等级结构)
工厂方法模式的工厂就生产一个产品,抽象工厂模式的工厂生产一个产品族的产品

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口。
无须指定它们具体的类

类型:创建型

适用场景:
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的
客户端(应用层)不依赖于产品类实例如何被创建,实现等细节
一个类通过其子类来指定创建哪个对象
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

优点:
用户只需要关心所需产品对应的工厂,无须关心创建细节
将一个系列的产品族统一到一起创建

缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
增加了系统的抽象性和理解难度
*/

/**
 * 用户端
 */
fun main() {
    
    
    val powerHuaWeiPhone = HuaWeiPhoneFactory.createPowerPhone()
    val gameHuaWeiPhone = HuaWeiPhoneFactory.createGamePhone()
    powerHuaWeiPhone.specialOptions()
    gameHuaWeiPhone.specialOptions()

    println("=========================================")

    val powerVivoPhone = VivoPhoneFactory.createPowerPhone()
    val gameVivoPhone = VivoPhoneFactory.createGamePhone()
    powerVivoPhone.specialOptions()
    gameVivoPhone.specialOptions()
}

四、运行结果

猜你喜欢

转载自blog.csdn.net/Duckdan/article/details/109735304
今日推荐