浅谈Java设计模式系列0x04---抽象工厂模式

浅谈Java设计模式系列0x00
浅谈Java设计模式系列0x01—单例模式
浅谈Java设计模式系列0x02—简单工厂模式
浅谈Java设计模式系列0x03—工厂方法模式

本次我们要给大家介绍的是工厂类的最后一个设计模式——抽象工厂模式;

抽象工厂

抽象工厂模式与工厂方法模式的不同在于:抽象工厂模式中的具体工厂不单单创建一种产品,它负责创建一族产品;
这里的一族产品可以这样理解:在同一个工厂生产的,位于不同产品等级结构的一组产品;
简单的说就是在同一工厂生产的不同类型的产品:比如苹果手机和苹果电脑就是一族产品;
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;

什么时候能用

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

模式结构

  • 抽象工厂(AbstractFactory): 它声明了一组用于创建一族产品的方法,每一方法对应一种产品;
  • 具体工厂(ConcreteFactory): 它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成一个产品族;
  • 抽象产品(AbstractProduct): 它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法;
  • 具体产品(ConcreteProduct): 它定义具体工厂生产的具体产品对象,实现抽象产品接口的方法;

举个例子

代码参考
本次将继续沿用手机工厂的例子,不过本次添加一个产品:笔记本电脑;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
* 抽象产品 Phone
*/

public interface Phone {
void call();
}
/**
*具体产品 AndroidPhone
*/

public class AndroidPhone implements Phone {
@Override
public void call() {
System.out.println("This is android phone calling.....");
}
}
/**
* 具体产品 ApplePhone
*/

public class ApplePhone implements Phone {
@Override
public void call() {
System.out.println("This is apple phone calling......");
}
}

/**
* 抽象产品 Laptop
*/

public interface Laptop {
void work();
}
/**
* 具体产品 ChromeBook
*/

public class ChromeBook implements Laptop {
@Override
public void work() {
System.out.println("The chromebook is working....");
}
}
/**
* 具体产品 MacBook
*/

public class MacBook implements Laptop{
@Override
public void work() {
System.out.println("The macbook is working.......");
}
}

/**
* 抽象工厂,声明多个工厂方法,用于创建不同类型的产品
*/

public interface Factory {
Phone createPhone();
Laptop createLaptop();
}
/**
* 具体工厂类,创建一族产品,这里是手机和笔记本电脑
*/

public class GoogleFactory implements Factory {
@Override
public Phone createPhone() {
return new AndroidPhone();
}

@Override
public Laptop createLaptop() {
return new ChromeBook();
}
}
/**
* 具体工厂类,创建一族产品,这里是手机和笔记本电脑
*/

public class AppleFactory implements Factory {
@Override
public Phone createPhone() {
return new ApplePhone();
}

@Override
public Laptop createLaptop() {
return new MacBook();
}
}
/**
* 测试类
*/

public class Client {
public static void main(String[] args) {
Factory factory=new GoogleFactory();
Phone android = factory.createPhone();
Laptop chromebook = factory.createLaptop();
android.call();
chromebook.work();
}
}

总结

抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用;
尤其是在一些框架和 API 类库的设计中,例如在java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面;
抽象工厂模式也是在软件开发中最常用的设计模式之一;

参考

抽象工厂模式
工厂三兄弟之抽象工厂模式