工厂模式与多态结合

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

多态(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
}
相关推荐
木棉软糖2 小时前
一个MySQL的数据表最多能够存多少的数据?
java
程序视点3 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
愿你天黑有灯下雨有伞3 小时前
Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
java·spring boot·spring
Java初学者小白3 小时前
秋招Day20 - 微服务
java
狐小粟同学4 小时前
JavaEE--3.多线程
java·开发语言·java-ee
KNeeg_5 小时前
Spring循环依赖以及三个级别缓存
java·spring·缓存
AI_Gump6 小时前
【AI阅读】20250717阅读输入
java·spring boot·spring
找不到、了6 小时前
Java排序算法之<插入排序>
java·算法·排序算法
设计师小聂!6 小时前
力扣热题100----------53最大子数组和
java·数据结构·算法·leetcode
笠码7 小时前
JVM Java虚拟机
java·开发语言·jvm·垃圾回收