前言
不管是简单工厂还是工厂方法,每个工厂都只生产一种产品,而在现实生活中是会存在一个工厂生产多种商品的情况的。比如电器工厂,会生产电视机,电冰箱,空调等。
工厂方法
接下来我们使用工厂方法来实现上面的案例。
定义产品
现在有两种产品,冰箱和空调,有两个厂商(美的和海尔)都能够生产这两种产品。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17interface IRefrigerator{
}
class HaierRefrigerator : IRefrigerator{
}
class MeidiRefrigerator : IRefrigerator{
}
interface IAirConditioner{
}
class HaierAirConditioner : IAirConditioner{
}
class MeidiAirConditioner : IAirConditioner{
}
定义工厂
因为每个工厂只生产对应的产品,所以我们需要定义两个工厂接口。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23interface IRefrigeratorFactory{
fun generateRefrigeratorImpl() : IRefrigerator
}
class HaierRefrigeratorFactory : IRefrigeratorFactory{
override fun generateRefrigeratorImpl() : IRefrigerator = HaierRefrigerator()
}
class MeidiRefrigerator : IRefrigeratorFactory{
override fun generateRefrigeratorImpl() : IRefrigerator = MeidiRefrigerator()
}
interface IAirConditionerFactory{
fun generateAirConditionerImpl() : AirConditioner
}
class HaierAirConditionerFactory : IAirConditionerFactory{
override fun generateAirConditionerImpl() : AirConditioner = HaierAirConditioner()
}
class MeidiAirConditionerFactory : IAirConditionerFactory{
override fun generateAirConditionerImpl(): AirConditioner = MeidiAirConditioner()
}
生产产品
比如现在要生产美的的冰箱和空调。1
2
3
4fun main(args : Array<String>){
val refrigerator = MeidiRefrigeratorFactory().generateRefrigeratorImpl()
val airConditioner = MeidiAirConditionerFactory().generateAirConditionerImpl()
}
思考
如果有N个产品需要生产,那么就需要扩展N个工厂。一旦工厂的数量变多,在调用的时候就很容易遗漏某些产品的生产,而且类的数量也会多很多,导致结构越来越复杂。
抽象工厂
像美的冰箱,美的空调是由相同的公司生产的,我们可以将其归为一个产品族,抽象工厂可以理解为一个工厂生产一个产品族的产品。现在我们来简化上面的代码。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16interface IFactory{
fun generateAirConditionerImpl() : IAirConditioner
fun generateRefrigeratorImpl() : IRefrigerator
}
class MeidiFactory : IFactory{
override fun generateAirConditionerImpl() : IAirConditioner = MeidiAirConditioner()
override fun generateRefrigeratorImpl() : IRefrigerator = MeidiRefrigerator()
}
class HaierFactory : IFactory{
override fun generateAirConditionerImpl() : IAirConditioner = HaierAirConditioner()
override fun generateRefrigeratorImpl() : IRefrigerator = HaierRefrigerator()
}
生产产品
现在工厂定义好了,我们想要生产美的的产品就可以直接通过一个工厂生产了。1
2
3
4
5fun main(args : Array<String>){
val factory : IFactory = MeidiFactory()
val airConditioner = factory.generateAirConditionerImpl()
val refrigerator = factory.generateRefrigeratorImpl()
}
如果某个产品族新增加了某个产品,只需要在抽象工厂中新增加生产该产品的方法就可以了,这样就减少了工厂方法会导致的结构复杂性。
毒鸡汤
日子还长,别太失望~