您的位置:首页 > 编程语言 > PHP开发

PHP工厂模式的好处

2009-07-01 15:27 316 查看
顾名思义,工厂是可以加工零件的,PHP程序中的工厂模式也有相同的功能,可以方便的使用一个静态的工厂方法来实例化某一个类,那么这样做的好处是什么呢?初学PHP的设计模式,以下是我个人的理解

一般我们实例化一个类会给它一些参数以便在其构析的时候可以根据不同的参数反馈出我们需要的结果。
举例说明,以下是一个User类,非常简单:

01.
<?php

02.

03.
interface
IUser

04.
{

05.
   
function
getName();

06.
   
function
getAge();

07.
}

08.

09.
class
User
implements
IUser

10.
{

11.
   
protected
$_name
;

12.
   
protected
$_age
;

13.

14.
   
function
__construct(
$name
,
$age
)

15.
   
{

16.
  
$this
->_name =
$name
;

17.
  
$this
->_age =(int)
$age
;

18.
   
}

19.

20.
   
function
getName()

21.
   
{

22.
  
return
$this
->_name;

23.
   
}

24.

25.
   
function
getAge()

26.
   
{

27.
  
return
$this
->_age;

28.
   
}

29.
}

30.

31.
?>


我们如果要实例化这个类就要这样:

1.
$u
=
new
User(
'小明'
,19);


一般如果这个类很少使用,那么这样做没什么太大影响,也非常好。
突然我想给这个类增加一个归类,把小明放入学生组,修改下类代码实现非常容易,但如果这个类在我们想修改之前在很多文件地方多次的实例化了,那么想为其增加一个参数就会变的非常烦琐,因为需要替换成:

1.
$u
=
new
User(
'小明'
,19,
'学生'
);


当然我们也可以通过在__construct函数中进行默认值设置来避免这种重复劳动,但事实上从代码优雅角度来说这样很不好,设想我们有一个工厂方法可以通过一个标识来对应一组参数,并把这个参数存放在某个文本文档或是直接以数组的形式存放在工厂类中,我们在调用User类的时候就会变的轻松许多,即便是需要增减参数属性也不需要到处进行代码的替换,下面就是一个工厂类(也可以直接将方法存放在User类)

01.
interface
IUser

02.
{

03.
   
function
getName();

04.
   
function
getAge();

05.
}

06.

07.
class
User
implements
IUser

08.
{

09.
   
protected
$_group
;

10.
   
protected
$_name
;

11.
   
protected
$_age
;

12.

13.
   
function
__construct(
$name
,
$age
,
$group
)

14.
   
{

15.
  
$this
->_group =
$group
;

16.
  
$this
->_name =
$name
;

17.
  
$this
->_age =(int)
$age
;

18.
   
}

19.

20.
   
function
getName()

21.
   
{

22.
  
return
$this
->_name;

23.
   
}

24.

25.
   
function
getAge()

26.
   
{

27.
  
return
$this
->_age;

28.
   
}

29.
}

30.

31.
class
Fuser

32.
{

33.
   
private
static
$group
=
array
(

34.
  
array
(
'小明'
,19,
'学生'
),

35.
  
array
(
'小王'
,19,
'学生'
)

36.
   
);

37.

38.
   
static
function
create(
$id
)

39.
   
{

40.
  
list(
$name
,
$age
,
$group
)=self::
$group
[(int)
$id
];

41.
  
return
new
User(
$name
,
$age
,
$group
);

42.
   
}

43.
}

44.

45.
echo
Fuser::create(0)->getName();


得到的结果应该是输出“小明”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: