设计模式之抽象工厂模式

抽象工厂模式的定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

这个定义和它的名字一样抽象,至少我从这个定义里面无法获取到任何有价值的信息,所以直接来看实例。

举个栗子

抽象工厂模式的模型图

这个图仍然看不出任何问题,甚至看不出来抽象工厂抽象在哪,所以再看一个具体一点的业务模型

在这里就可以看出来问题了,抽象工厂其实是对工厂模式维度的扩展,在抽象工厂中可以有不同的产品族,每个产品族的产品又可以划分成多个具体的等级,而每一种工厂专门负责生产某一等级的产品,下面是编码实现

  • 产品族A及1、2两个产品等级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class AbstractProductA {
public void method1() {
//A产品共有逻辑
}
public abstract void method2();
}

public class ConcreteProductA1 extends AbstractProductA {
public void method2() {
//A1的实现
}
}

public class ConcreteProductA2 extends AbstractProductA {
public void method2() {
//A2的实现
}
}
  • 产品族B及1、2两个产品等级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class AbstractProductB {
public void method1() {
//B产品共有逻辑
}
public abstract void method2();
}

public class ConcreteProductB1 extends AbstractProductB {
public void method2() {
//B1的实现
}
}

public class ConcreteProductB2 extends AbstractProductB {
public void method2() {
//B2的实现
}
}
  • 抽象工厂及1、2两个产品等级的工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class AbstractFactory {
//产品族A创建方法
public abstract AbstractProductA createProductA();
//产品族B创建方法
public abstract AbstractProductB createProductB();
}

public class ConcreteFactory1 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}

public class ConcreteFactory2 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}

在抽象工厂中,有X个产品族,抽象工厂内就要有X个创建方法,有Y个产品等级就要有Y个实现工厂类,每个具体工厂中实现不同产品族的生产。在调用时候,完全不用关心具体实现,只需要确定产品族和等级,就能创建出自己想要的产品。

适用范围

抽象工厂是对工厂方法模式的升级,它的解决的是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,这样的情况下可以使用抽象工厂模式。

优点缺点

抽象工厂的优点是封装性非常好,产品组的内部约束是完全隐藏状态,调用者无需关心除了工厂之外的东西。

抽象工厂的缺点就是产品族无法扩展,一旦需要增加内容,就要进行大幅度调整和修改,一方面违反开闭原则,另一方面随着结构复杂修改将会越来越多。

注意事项

上面在缺点中提到了产品族扩展困难,但是从另一个角度来看,抽象工厂扩展产品等级还是很容易的,也是符合开闭原则的,实际使用中还是要在详细考量业务需求后再做出选择。

简单工厂模式,工厂方法模式和抽象工厂模式都是为了降低程序之间的耦合而设计的,使用的时候往往不需要纠结具体用的是哪一种,在具体的业务场景下我们只要关心能否解耦就可以了。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!