我是靠谱客的博主 眼睛大云朵,这篇文章主要介绍抽象工厂模式(通俗易懂),现在分享给大家,希望可以做个参考。

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

理解产品族和产品等级

产品族:一个品牌下面的所有产品;例如华为下面的手机,路由器,电脑 称为华为的产品族;

产品等级:多个品牌下面的同种产品;例如华为和小米下面的手 称为一个产品等级;

image20200826105220926.png

类图分析:

以下图为例,有手机和路由器两种产品,有华为和小米两种品牌,两种品牌都可以生产手机和路由器;

  1. 有手机和路由器两种产品,定义两个接口;
  2. 小米和华为都可以生产这两种产品,所以有4个实现类;
  3. 现在需要创建华为和小米的工厂类,先将工厂类进行抽象,里面有创建两个产品的方法,返回的是产品的接口类;
  4. 创建华为和小米的工厂实现类,继承工厂类接口,实现创建各自产品的方法;
  5. 客户端调用时,直接用工厂接口类创建需要的工厂,拿到对应的产品;

在这里插入图片描述

代码实现

  1. 手机产品接口和路由器产品接口
复制代码
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
//手机产品接口 public interface IPhoneProduct { //开机 void start(); //关机 void shutdown(); //打电话 void callup(); //发邮件 void sendSMS(); } //路由器产品接口 public interface IRouterProduct { //开机 void start(); //关机 void shutdown(); //打开wifi void openwifi(); //设置 void setting(); }
  1. 华为和小米的产品的4个实现类
复制代码
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
//华为手机实现类 public class HuaweiPhone implements IPhoneProduct { @Override public void start() { System.out.println("开启华为手机"); } @Override public void shutdown() { System.out.println("关闭华为手机"); } @Override public void callup() { System.out.println("华为手机打电话"); } @Override public void sendSMS() { System.out.println("华为手机发邮件"); } } //华为路由器实现类 public class HuaweiRouter implements IRouterProduct { @Override public void start() { System.out.println("开启华为路由器"); } @Override public void shutdown() { System.out.println("关闭华为路由器"); } @Override public void openwifi() { System.out.println("打开华为wifi"); } @Override public void setting() { System.out.println("设置华为路由器"); } } //小米手机实现类 public class XiaomiPhone implements IPhoneProduct { @Override public void start() { System.out.println("开启小米手机"); } @Override public void shutdown() { System.out.println("关闭小米手机"); } @Override public void callup() { System.out.println("小米手机打电话"); } @Override public void sendSMS() { System.out.println("小米手机发邮件"); } } //小米路由器实现类 public class XiaomiRouter implements IRouterProduct { @Override public void start() { System.out.println("开启小米路由器"); } @Override public void shutdown() { System.out.println("关闭小米路由器"); } @Override public void openwifi() { System.out.println("打开小米wifi"); } @Override public void setting() { System.out.println("设置小米路由器"); } }
  1. 工厂接口类;
复制代码
1
2
3
4
5
6
7
8
9
10
//产品工厂接口 public interface IProductFactory { //生产手机 IPhoneProduct phoneProduct(); //生成路由器 IRouterProduct routerProduct(); }
  1. 华为和小米工厂实现类,继承工厂接口
复制代码
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
//华为工厂实现类 public class HuaweiFactory implements IProductFactory { @Override public IPhoneProduct phoneProduct() { return new HuaweiPhone(); } @Override public IRouterProduct routerProduct() { return new HuaweiRouter(); } } //小米工厂实现类 public class XiaomiFactory implements IProductFactory { @Override public IPhoneProduct phoneProduct() { return new XiaomiPhone(); } @Override public IRouterProduct routerProduct() { return new XiaomiRouter(); } }
  1. 客户端,通过 IProductFactory 创建各自的工厂,通过工厂拿到对应的产品
复制代码
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
public class Client { public static void main(String[] args) { System.out.println("============小米产品============"); //创建小米工厂 IProductFactory xiaomiFactory = new XiaomiFactory(); //生产小米手机 IPhoneProduct xiaomiPhone = xiaomiFactory.phoneProduct(); xiaomiPhone.start(); xiaomiPhone.sendSMS(); //生产小米路由器 IRouterProduct xiaomiRouter = xiaomiFactory.routerProduct(); xiaomiRouter.openwifi(); xiaomiRouter.setting(); System.out.println("============华为产品============"); //创建华为工厂 IProductFactory huaweiFactory = new HuaweiFactory(); //生产华为手机 IPhoneProduct huaweiPhone = huaweiFactory.phoneProduct(); huaweiPhone.start(); huaweiPhone.sendSMS(); //生产华为路由器 IRouterProduct huaweiRouter = huaweiFactory.routerProduct(); huaweiRouter.openwifi(); huaweiRouter.setting(); } }

抽象工厂模式的实现就是这样,还记得前面讲的产品族和产品等级的概念吗,如果新增一个产品族或产品等级会怎样?

拓展一个产品族

我们会发现,拓展一个产品族是非常困难的,例如产品族中新增一个笔记本电脑,也就是说华为和小米现在可以生产电脑了,如下图所示(黄色字体为新增一个产品族需要做的事),对顶层的工厂接口类也要修改,这是非常麻烦的;

在这里插入图片描述

拓展一个产品等级

如果扩展一个产品等级,例如新增一个手机,也就是说新增一个品牌来生产手机,如下图所示(黄色字体为新增一个产品等级需要做的事),新增一个产品等级不用修改原来的代码,符合OCP原则,这是非常舒服的;

在这里插入图片描述

所以抽象工厂模式的优缺点

优点:一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建);

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;
  • 增加了系统的抽象性和理解难度;

适用场景

  • 一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码;
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现;

抽象工厂模式符合依赖抽象原则

  • 创建对象实例时,不要直接 new一个对象, 而是把创建对象的动作放在一个工厂的方法中;
  • 不要让类继承具体类,而是继承抽象类或者是实现接口;
  • 不要覆盖基类中已经实现的方法;

最后

以上就是眼睛大云朵最近收集整理的关于抽象工厂模式(通俗易懂)的全部内容,更多相关抽象工厂模式(通俗易懂)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部