目录

创建型:抽象工厂模式

释义

抽象工厂模式,在工厂模式的基础上增加了一个能够生产工厂的超级工厂SuperFactory。抽象工厂AbstractFactory可以转变成模具厂ShapeFactory,也可以转变为颜料厂ColorFactory。 客户将订单交给超级工厂,超级工厂根据客户的需求,在抽象工厂的基础上建立模具厂或者颜料厂,并生产所需的产品。

/%E5%88%9B%E5%BB%BA%E5%9E%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/%E5%88%9B%E5%BB%BA%E5%9E%8B%EF%BC%9A%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.resources/3F23956E-5D35-4A74-B9AC-8E8EF5A1F324.png
抽象工厂模式
这个超级工厂可以生产ShapeFactory和ColorFactory两种工厂,这些工厂再分别去生产各自的产品。

超级工厂

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class SuperFactory {
    companion object {
        val COLOR: Int = 0x1
        val SHAPE: Int = 0x2
    }
    
    // 超级工厂根据type生产不同类型的工厂
    fun getFactory(type: Int) {
        when(type) {
            COLOR -> object : ColorFactory()
            SHAPE -> object : ShapeFactory()
        }
    }
}

抽象工厂

我们可以在抽象工厂的基础上建设模具厂或者颜料厂。

1
2
3
4
abstract class AbstractFactory {
    fun getShape(): Shape?
    fun getColor(): Color?
}

子工厂

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 变为模具厂
class ShapeFactory : AbstractFactory() {
    
    companion object {
        val CIRCLE = 0x0
        val SQUARE = 0x1
        val RECTANGLE = 0x2
    }
    
    override fun getShape(type: Int): Shape? {
        // 与工厂模式相同,根据客户提交的type生产所需的产品
        when(type) {
                CIRCLE -> object : Circle()
                SQUARE -> object : Square()
                RECTANGLE -> object : Rectangle()
        }
    }
    
    // 模具厂无法生产颜料
    override fun getColor(): Color? {
        return null
    }
}

颜料厂同理,不赘述。

使用

1
2
3
4
5
6
7
// 生产Circle
fun main() {
    val superFactory: SuperFactory = SuerpFactory()
    val circle: Circle = SuperFactory
        .getFactory(SuperFactory.SHAPE)
        .getShape(ShapeFactory.RED)
}