◉◡◉ 您好,欢迎到访伊成个人站!

java设计模式之抽象工厂模式

抽象工厂模式介绍

抽象工厂模式的定义:为创建一组相关或者互相依赖的对象提供一个接口,而无需指定它们对应的具体类。

具体可以这样理解,世界各地都有自己的水果园,我们将这些水果园抽象为一个水果园接口,在中国、英国和美国都有水果园,种植不同的水果,比如苹果、香蕉和梨等。这里将苹果进行抽象,所以,苹果又分为中国苹果,英国苹果和美国苹果。中国的水果园中有苹果、香蕉和梨等。抽象工厂中声明生产苹果、香蕉和梨等水果,那么具体的工厂相当于中国、英国和美国的水果园,各个水果园负责生产水果、香蕉和梨等。

抽象工厂模式UML类图

“伊成博客”

对比工厂方法模式,通过它们之间的类图对比,得知工厂方法模式中也是可以有多个具体工厂,也是可以有多个抽象产品,和多个具体工厂、具体产品类。

区别是在抽象工厂接口类中,能创建几个产品对象。抽象工厂模式的工厂能创建多个相关的产品对象,而工厂方法模式的工厂只创建一个产品对象。

举个例子

利用抽象工厂模式演示文中开头提及的世界各地都有自己的水果园的理解,下面请看代码。

1.创建Fruit接口、Apple抽象类、ChinaApple类等

Fruit(interface):

1
2
3
public interface Fruit {
public void get();
}

Apple抽象类:

1
2
3
public abstract class Apple implements Fruit{
public abstract void get();
}

ChinaApple类:

1
2
3
4
5
6
7
public class ChinaApple extends Apple {

@Override
public void get() {
System.out.println("中国的苹果...");
}
}

2.创建抽象工厂、具体工厂

抽象工厂:

1
2
3
4
5
6
public interface FruitFactory {
//实例化苹果
public Fruit getApple();
//实例化香蕉
public Fruit getBanana();
}

具体工厂:

1
2
3
4
5
6
7
8
9
10
11
12
 public class ChinaFactory implements FruitFactory {

@Override
public Fruit getApple() {
return new ChinaApple();
}

@Override
public Fruit getBanana() {
return new ChinaBanana();
}
}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainClass {

public static void main(String[] args){
//创建中国工厂
FruitFactory chinaFactory = new ChinaFactory();
//通过中国工厂生产中国苹果实例
Fruit apple = chinaFactory.getApple();
apple.get();
//通过中国工厂生产中国香蕉实例
Fruit banana = chinaFactory.getBanana();
banana.get();

//创建英国工厂
FruitFactory englandFactory = new EnglandFactory();
//通过英国工厂生产英国苹果实例
Fruit apple1 = englandFactory.getApple();
apple1.get();
//通过英国工厂生产英国香蕉实例
Fruit banana2 = englandFactory.getBanana();
banana2.get();
}
}

结果输出如下:
“伊成博客”

抽象工厂模式的优缺点

优点:
1.针对同一组产品创建新的生产线,只需实现那组产品的抽象工厂接口即可创建新的工厂类。

缺点:
抽象工厂模式的最大缺点就是产品族本身的扩展非常困难。如果在产品族中增加一个新的产品类型,则需要修改多个接口,并影响现已有的工厂类。

抽象工厂模式使用案例
1.在JDK中的应用,Collection接口
“伊成博客”

Collection就是一个抽象工厂,它提供了一个产品类的库,所有产品都以同样接口出现,从而使客户端不依赖于具体实现。工厂方法则是抽象工厂里面的其中一个产品类,并且把这个方法的实例化放入具体的实现类中 。

小结

工厂模式有三种:简单工厂模式,工厂方法模式,抽象工厂模式。
三种工厂模式个人感觉最大的区别就是,每种模式抽象的层级不一样,抽象的程度不一样。
不存在那种设计模式比较好,存在即合理。特定场景使用符合的设计模式才是正确的选择。


The end.

支付宝打赏 微信打赏