PHP设计模式之工厂模式详解

2025-05-29 0 83

在开发大型系统时,往往会出现这样一种情况:

我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,那么什么是紧耦合呢?紧耦合就是指系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。

这时,工厂模式的作用性就体现出来了。

工厂模式

就是解决这样的一些情况的设计方法。

工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类,修改配置等。

/*基本工厂模式代码*/

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
<?php

/**

* 基本工厂模式

* */

class User {

private $username;

public function __construct($username) {

$this->username = $username;

}

public function getUser() {

return $this->username;

}

}

class userFactory {

static public function createUser() {

return new User('Jack');

}

}

$user = userFactory::createUser();echo $user->getUser();

?>

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

?

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
<?php

/**

*简单工厂模式

* */

interface userProperties {

function getUsername();

function getGender();

function getJob();

}

class User implements userProperties{

private $username;

private $gender;

private $job;

public function __construct($username, $gender, $job) {

$this->username = $username;

$this->gender = $gender;

$this->job = $job;

}

public function getUsername() {

return $this->username;

}

public function getGender() {

return $this->gender;

}

public function getJob() {

return $this->job;

}

}

class userFactory {

static public function createUser($properties = []) {

return new User($properties['username'], $properties['gender'], $properties['job']);

}

}

$employers = [

['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],

['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],

];

$user = userFactory::createUser($employers[0]);

echo $user->getUsername();

?>

工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。

?

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
<?php

/**

* 工厂方法模式

**/

interface userProperties {

function getUsername();

function getGender();

function getJob();

}

interface createUser {

function create($properties);

}

class User implements userProperties{

private $username;

private $gender;

private $job;

public function __construct($username, $gender, $job) {

$this->username = $username;

$this->gender = $gender;

$this->job = $job;

}

public function getUsername() {

return $this->username;

}

public function getGender() {

return $this->gender;

}

public function getJob() {

return $this->job;

}

}

class userFactory {

private $user;

public function __construct($properties = []) {

$this->user = new User($properties['username'], $properties['gender'], $properties['job']);

}

public function getUser() {

return $this->user;

}

}

class FactoryMan implements createUser {

function create($properties) {

return new userFactory($properties);

}

}

class FactoryWoman implements createUser {

function create($properties) {

return new userFactory($properties);

}

}

class clientUser {

static public function getClient($properties) {

$fac = new FactoryMan;

$man = $fac->create($properties);

echo $man->getUser()->getUsername();

}

}

$employers = [

['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],

['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],

];

$user = clientUser::getClient($employers[0]);

?>

抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

?

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
<?php

/**

* 抽象工厂模式

* */

interface userProperties {

function getUsername();

function getGender();

function getJob();

}

interface createUser { //将对象的创建抽象成一个接口

function createOpen($properties);//内向创建

function createIntro($properties);//外向创建

}

class User implements userProperties{

private $username;

private $gender;

private $job;

public function __construct($username, $gender, $job) {

$this->username = $username;

$this->gender = $gender;

$this->job = $job;

}

public function getUsername() {

return $this->username;

}

public function getGender() {

return $this->gender;

}

public function getJob() {

return $this->job;

}

}

class userFactory {

private $user;

public function __construct($properties = []) {

$this->user = new User($properties['username'], $properties['gender'], $properties['job']);

}

public function getUser() {

return $this->user;

}

}

class FactoryMan implements createUser {

function createOpen($properties) {

return new userFactory($properties);

}

function createIntro($properties) {

return new userFactory($properties);

}

}

class FactoryWoman implements createUser {

function createOpen($properties) {

return new userFactory($properties);

}

function createIntro($properties) {

return new userFactory($properties);

}

}

class clientUser {

static public function getClient($properties) {

$fac = new FactoryMan;

$man = $fac->createOpen($properties);

echo $man->getUser()->getUsername();

}

}

$employers = [

['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],

['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],

];

$user = clientUser::getClient($employers[0]);

?>

如有错误,请指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.cnblogs.com/zlnevsto/archive/2017/10/24/7679280.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP设计模式之工厂模式详解 https://www.kuaiidc.com/93379.html

相关文章

发表评论
暂无评论