工厂模式与多态结合

工厂模式与多态的结合是平台化项目中实现灵活架构的核心技术之一。这种组合能够创建可扩展、易维护的系统架构。

多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

例子1:

java 复制代码
public abstract class PaymentProcessor {
    public abstract void process(Payment payment);
}

public class CreditCardProcessor extends PaymentProcessor {
    public void process(Payment payment) { /* 信用卡处理逻辑 */ }
}

public class PayPalProcessor extends PaymentProcessor {
    public void process(Payment payment) { /* PayPal处理逻辑 */ }
}

public class PaymentProcessorFactory {
    public static PaymentProcessor create(String type) {
        switch(type) {
            case "creditcard": return new CreditCardProcessor();
            case "paypal": return new PayPalProcessor();
            default: throw new IllegalArgumentException();
        }
    }
}

// 使用
PaymentProcessor processor = PaymentProcessorFactory.create("creditcard");
processor.process(payment);

例子2:

Kotlin 复制代码
abstract class IPhoneLinkAdapter(val context: Context) {
    abstract fun getPhoneLinkType(): Int
    abstract fun getPhoneLinkName(): String
}



abstract class ICarPlayLinkAdapter(context: Context) : IPhoneLinkAdapter(context) {
    override fun getPhoneLinkType() = PhoneLinkType.CARPLAY
}

abstract class IAndroidAutoLinkAdapter(context: Context) : IPhoneLinkAdapter(context) {
    override fun getPhoneLinkType() = PhoneLinkType.ANDROID_AUTO
    override fun getPhoneLinkName() = context.getString(R.string.androidauto)
}

class ACarPlayLinkAdapter(context: Context) : ICarPlayLinkAdapter(context) {
    override fun getPhoneLinkName() = context.getString(R.string.carplay_a)
}

class BCarPlayLinkAdapter(context: Context) : ICarPlayLinkAdapter(context) {
    override fun getPhoneLinkName() = context.getString(R.string.carplay_b)
}

class AAndroidAutoLinkAdapter(context: Context) : IAndroidAutoLinkAdapter(context) {
}

class BAndroidAutoLinkAdapter(context: Context) : IAndroidAutoLinkAdapter(context) {
}



object PhoneLinkAdapterFactory {
    fun getPhoneLinkAdapters(context: Context): HashSet<IPhoneLinkAdapter> {
        val linkAdapters = HashSet<IPhoneLinkAdapter>()

        if (条件1) {
            linkAdapters.add(ACarPlayLinkAdapter(context))
        } else if (条件2) {
            linkAdapters.add(BCarPlayLinkAdapter(context))
        } 

        if (条件3) {
            linkAdapters.add(AAndroidAutoLinkAdapter(context))
        } else if (条件4) {
            linkAdapters.add(BAndroidAutoLinkAdapter(context))
        } 

        return linkAdapters
    }
}




//使用
internal val linkAdapters by lazy { PhoneLinkAdapterFactory.getPhoneLinkAdapters(mContext) }

fun getPhoneLinkName(phoneLinkType: Int): String {
    return getPhoneLinkAdapter(phoneLinkType)?.getPhoneLinkName() ?: ""
}

internal fun getPhoneLinkAdapter(phoneLinkType: Int): IPhoneLinkAdapter? {
    return linkAdapters.find { it.getPhoneLinkType() == phoneLinkType }
}

fun isWirelessConnected(): Boolean {
    linkAdapters.forEach {
        if (it.isWirelessConnected()) {
            return true
        }
    }
    return false
}
相关推荐
skiy几秒前
Spring boot创建时常用的依赖
java·spring boot·后端
早起的年轻人3 分钟前
告别Git仓库臃肿:一招解决Maven target目录误提交问题
java·git·maven
lishutong10063 分钟前
直破 Android 17 大屏困局:Navigation 3 架构深度解析
android·架构
梦里花开知多少6 分钟前
AOSP Android 14 壁纸架构深度分析
android
快乐柠檬不快乐8 分钟前
Java连接电科金仓数据库(KingbaseES)实战指南
java·开发语言·数据库
程序员清风10 分钟前
看完Anthropic研究才懂:你有多会问,AI就有多强!
java·后端·面试
爱学习的小囧11 分钟前
VCF 集群部署灵活组合:单节点与高可用配置完全指南
java·服务器·前端
代码方舟16 分钟前
Java金融风控实战:集成天远二手车估值API构建车贷抵押资产核验系统
java·开发语言·python·自动化
sg_knight17 分钟前
Claude Code 如何辅助定位 Bug 和问题代码
java·前端·bug·ai编程·claude·code·claude-code
counting money18 分钟前
HttpServlet基础
java