工厂模式与多态结合

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

多态(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
}
相关推荐
好好研究1 分钟前
SpringBoot注解的作用
java·spring boot·spring
Libby博仙22 分钟前
Spring Boot 条件化注解深度解析
java·spring boot·后端
消失的旧时光-194328 分钟前
Android 接入 Flutter(Add-to-App)最小闭环:10 分钟跑起第一个混合页面
android·flutter
我是小疯子6629 分钟前
深入解析C++右值引用与移动语义
java·开发语言·算法
better_liang32 分钟前
每日Java面试场景题知识点之-JUC锁的底层原理
java·并发编程·juc·锁机制·reentrantlock·readwritelock·底层原理
悟能不能悟36 分钟前
Elastic Stack 中两种主要查询语言 KQL (Kibana Query Language) 和 Lucene 的详细对比和解释。
java·开发语言
城东米粉儿42 分钟前
android StrictMode 笔记
android
我是一只小青蛙88843 分钟前
Java连接MySQL数据库实战指南
java
Zender Han1 小时前
Flutter Android 启动页 & App 图标替换(不使用任何插件的完整实践)
android·flutter·ios
夏末4721 小时前
Java异常处理终极指南:从入门到企业级实战,让程序稳如老狗!
java·java ee