设计模式-抽象工厂

前言

  不管是简单工厂还是工厂方法,每个工厂都只生产一种产品,而在现实生活中是会存在一个工厂生产多种商品的情况的。比如电器工厂,会生产电视机,电冰箱,空调等。

工厂方法

  接下来我们使用工厂方法来实现上面的案例。

定义产品

  现在有两种产品,冰箱和空调,有两个厂商(美的和海尔)都能够生产这两种产品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface 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
23
interface 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
4
fun 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
16
interface 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
5
fun main(args : Array<String>){
val factory : IFactory = MeidiFactory()
val airConditioner = factory.generateAirConditionerImpl()
val refrigerator = factory.generateRefrigeratorImpl()
}

  如果某个产品族新增加了某个产品,只需要在抽象工厂中新增加生产该产品的方法就可以了,这样就减少了工厂方法会导致的结构复杂性。

毒鸡汤

  日子还长,别太失望~

本文标题:设计模式-抽象工厂

文章作者:严方雄

发布时间:2018-02-28

最后更新:2018-09-13

原始链接:http://yanfangxiong.com/2018/02/28/设计模式-抽象工厂/

0%