工厂模式与多态的结合是平台化项目中实现灵活架构的核心技术之一。这种组合能够创建可扩展、易维护的系统架构。
多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
例子1:
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:
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
}