一、简介
抽象工厂模式(Abstract Factory Pattern) 区别于 工厂模式,后者是单个工厂work for单个或者多个 Product 的实现类,而前者就是单个工厂work for多个抽象工厂的实现类(禁止____!)。
定义:抽象工厂模式 将工厂类抽象出来,抽出来的类(或者接口)用于创建具体的工厂类。
使用场景:在基于 工厂模式 上,被生产的类型存在多个具体实现类,且单个 工厂类 不能同时实现多个具体类的对象创建,你就可以使用 抽象工厂模式。
实现要素:清晰的树形结构。
抽象工厂模式 实际上就是再在工厂模式 的基础上,定义 工厂 的工厂类,以数量换取解耦,那么最大的缺点就很明显了,那就是类的数量(文件)增多。
二、实现
我们遵循其原则,将 工厂类 抽出一层来,创建 工厂类 的 工厂类,最顶层的 工厂类 我们就称之为 抽象工厂。
我们继续以汽车厂为例:
- 汽车抽象类和汽车具体类
abstract class Car(val brand: String, val modelNum: String) {
abstract fun getProductPlace():String
}
class Lynk(modelNum: String) : Car("领克", modelNum) {
override fun getProductPlace() = "中国"
}
class VM(modelNum: String) : Car("大众", modelNum) {
override fun getProductPlace() = "德国"
}
- 汽车抽象工厂类和汽车工厂类
abstract class CarFactory {
abstract fun productCar():Car
}
object FactoryProvider {
@JvmStatic
fun<F:CarFactory> getFactory(clazz: Class<F>):CarFactory {
return clazz.newInstance()
}
}
class Lynk05Factory : CarFactory() {
override fun productCar(): Car {
return Lynk("05")
}
}
class Lynk03Factory:CarFactory(){
override fun productCar(): Lynk {
return Lynk("03")
}
}
class GolfFactory: CarFactory() {
override fun productCar(): VM {
return VM("golf")
}
}
- 使用
fun main() {
val lynk05 = FactoryProvider.getFactory(Lynk05Factory::class.java).productCar()
val golf = FactoryProvider.getFactory(GolfFactory::class.java).productCar()
}
三、相关源码
找不到……如果有找到的小伙伴,欢迎留言……
四、小结
抽象工厂模式 的应用场景不是很广泛,那是因为在实际开发中,除非是处女座的程序员或者架构师,才是使用该模式,疯狂的解耦解耦解耦。