Rumah > pembangunan bahagian belakang > tutorial php > 聊聊PHP中的抽象工厂模式

聊聊PHP中的抽象工厂模式

青灯夜游
Lepaskan: 2023-04-10 08:52:02
ke hadapan
2848 orang telah melayarinya

本篇文章带大家了解一下PHP设计模式中的抽象工厂模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

聊聊PHP中的抽象工厂模式

工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式。初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着“抽象”两个字。话说这两个字在开发中真的是有点高大上的感觉,一带上抽象两字就好像哪哪都很厉害了呢。不过,抽象工厂也确实可以说是工厂模式的大哥大。

Gof类图及解释

其实只要理解了工厂方法模式,就很容易明白抽象工厂模式。怎么说呢?还是一样的延迟到子类,还是一样的返回指定的对象。只是抽象工厂里面不仅仅只返回一个对象,而是返回一堆。

GoF定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

GoF类图:

1.gif

  • 左边是两个工厂1和2,都继承一个抽象工厂,都实现了CreateProductA和CreateProductB方法
  • 工厂1生产的是ProductA1和ProductB1
  • 同样的,工厂2生产的是ProductA2和ProductB2

代码实现

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

// 商品A抽象接口

interface AbstractProductA

{

    public function show(): void;

}

 

// 商品A1实现

class ProductA1 implements AbstractProductA

{

    public function show(): void

    {

        echo 'ProductA1 is Show!' . PHP_EOL;

    }

}

// 商品A2实现

class ProductA2 implements AbstractProductA

{

    public function show(): void

    {

        echo 'ProductA2 is Show!' . PHP_EOL;

    }

}

 

// 商品B抽象接口

interface AbstractProductB

{

    public function show(): void;

}

// 商品B1实现

class ProductB1 implements AbstractProductB

{

    public function show(): void

    {

        echo 'ProductB1 is Show!' . PHP_EOL;

    }

}

// 商品B2实现

class ProductB2 implements AbstractProductB

{

    public function show(): void

    {

        echo 'ProductB2 is Show!' . PHP_EOL;

    }

}

Salin selepas log masuk

商品的实现,东西很多吧,这回其实是有四件商品了分别是A1、A2、B1和B2,他们之间假设有这样的关系,A1和B1是同类相关的商品,B1和B2是同类相关的商品

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

// 抽象工厂接口

interface AbstractFactory

{

    // 创建商品A

    public function CreateProductA(): AbstractProductA;

    // 创建商品B

    public function CreateProductB(): AbstractProductB;

}

 

// 工厂1,实现商品A1和商品B1

class ConcreteFactory1 implements AbstractFactory

{

    public function CreateProductA(): AbstractProductA

    {

        return new ProductA1();

    }

    public function CreateProductB(): AbstractProductB

    {

        return new ProductB1();

    }

}

 

// 工厂2,实现商品A2和商品B2

class ConcreteFactory2 implements AbstractFactory

{

    public function CreateProductA(): AbstractProductA

    {

        return new ProductA2();

    }

    public function CreateProductB(): AbstractProductB

    {

        return new ProductB2();

    }

}

Salin selepas log masuk

而我们的工厂也是工厂1和工厂2,工厂1生产的是A1和B1这两种相关联的产品,工厂2生产的是A2和B2这两种商品。好吧,我知道这里还是有点抽象,可能还是搞不懂为什么要这样,我们继续以手机生产来举例。

我们的手机品牌起来了,所以周边如手机膜、手机壳也交给了富X康(AbstractFactory)来帮我搞定。上回说到,我已经有几款不同类型的手机了,于是还是按原来那样,衡阳工厂(Factory1)生产型号1001的手机(ProductA1),同时型号1001手机的手机膜(ProductB1)和手机壳(ProductC1)也是衡阳工厂生产出来。而型号1002的手机(ProductA2)还是在郑州工厂(Factory2),这个型号的手机膜(ProductB2)和手机膜(ProductC2)也就交给他们来搞定吧。于是,我还是只去跟总厂下单,他们让不同的工厂给我生产了一整套的手机产品,可以直接卖套装咯!!

完整代码:抽象工厂模式

https://github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/abstract-factory.php

实例

是不是看得还是有点晕。其实说简单点,真的就是在一个工厂类中通过不同的方法返回不同的对象而已。让我们再次用发短信的实例来讲解吧!

场景:这次我们有个业务需求是,不仅要发短信,还要同时发一条推送。短信的目的是通知用户有新的活动参加,而推送不仅通知有新的活动,直接点击就可以进去领红包了,是不是很兴奋。还好之前我们的选择的云服务供应商都是即有短信也有推送接口的,所以我们就直接用抽象工厂来实现吧!

短信发送类图

2.gif

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

98

99

<?php

 

interface Message {

    public function send(string $msg);

}

 

class AliYunMessage implements Message{

    public function send(string $msg){

        // 调用接口,发送短信

        // xxxxx

        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;

    }

}

 

class BaiduYunMessage implements Message{

    public function send(string $msg){

        // 调用接口,发送短信

        // xxxxx

        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;

    }

}

 

class JiguangMessage implements Message{

    public function send(string $msg){

        // 调用接口,发送短信

        // xxxxx

        return &#39;极光短信发送成功!短信内容:&#39; . $msg;

    }

}

 

interface Push {

    public function send(string $msg);

}

 

class AliYunPush implements Push{

    public function send(string $msg){

        // 调用接口,发送客户端推送

        // xxxxx

        return &#39;阿里云Android&iOS推送发送成功!推送内容:&#39; . $msg;

    }

}

 

class BaiduYunPush implements Push{

    public function send(string $msg){

        // 调用接口,发送客户端推送

        // xxxxx

        return &#39;百度Android&iOS云推送发送成功!推送内容:&#39; . $msg;

    }

}

 

class JiguangPush implements Push{

    public function send(string $msg){

        // 调用接口,发送客户端推送

        // xxxxx

        return &#39;极光推送发送成功!推送内容:&#39; . $msg;

    }

}

 

 

interface MessageFactory{

    public function createMessage();

    public function createPush();

}

 

class AliYunFactory implements MessageFactory{

    public function createMessage(){

        return new AliYunMessage();

    }

    public function createPush(){

        return new AliYunPush();

    }

}

 

class BaiduYunFactory implements MessageFactory{

    public function createMessage(){

        return new BaiduYunMessage();

    }

    public function createPush(){

        return new BaiduYunPush();

    }

}

 

class JiguangFactory implements MessageFactory{

    public function createMessage(){

        return new JiguangMessage();

    }

    public function createPush(){

        return new JiguangPush();

    }

}

 

// 当前业务需要使用阿里云

$factory = new AliYunFactory();

// $factory = new BaiduYunFactory();

// $factory = new JiguangFactory();

$message = $factory->createMessage();

$push = $factory->createPush();

echo $message->send(&#39;您已经很久没有登录过系统了,记得回来哦!&#39;);

echo $push->send(&#39;您有新的红包已到帐,请查收!&#39;);

Salin selepas log masuk

完整源码:短信发送工厂方法

https://github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/abstract-factory-message-push.php

说明

  • 是不是很清晰了?
  • 没错,我们有两个产品,一个是Message,一个是Push,分别是发信息和发推送
  • 抽象工厂只是要求我们的接口实现者必须去实现两个方法,返回发短信和发推送的对象
  • 你说我只想发短信不想发推送可以吗?当然可以啦,不去调用createPush()方法不就行了
  • 抽象工厂最适合什么场景?很明显,一系列相关对象的创建
  • 工厂方法模式是抽象工厂的核心,相当于多个工厂方法被放到一个大工厂中生产一整套产品(包含周边)而不是一件单独的产品

推荐学习:《PHP视频教程

Atas ialah kandungan terperinci 聊聊PHP中的抽象工厂模式. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan