-
Notifications
You must be signed in to change notification settings - Fork 3
/
FactoryMethod.php
87 lines (75 loc) · 1.44 KB
/
FactoryMethod.php
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
<?php
/**
* 工厂方法模式
*
* 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
*
* 工厂方法克服了简单工厂违背了开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
* 工厂方法模式是简单工厂的进一步抽象和推广
*
*/
class LeiFeng
{
public function sweep()
{
echo '扫地' . PHP_EOL;
}
public function wash()
{
echo '洗衣' . PHP_EOL;
}
public function buyRice()
{
echo '买米' . PHP_EOL;
}
}
/**
* 雷锋的继承者
* 也可以有更多的方法
*
* Class Undergraduate
*/
class Undergraduate extends LeiFeng
{
public function sweep()
{
parent::sweep();
echo '扫地后休息一会' . PHP_EOL;
}
}
class Volunteer extends LeiFeng
{
}
/**
* 创建雷锋的接口
*
* Interface IFactory
*/
interface IFactory
{
public function createLeiFeng();
}
/**
* 实现创建雷锋
*
* Class UndergraduateFactory
*/
class UndergraduateFactory implements IFactory
{
public function createLeiFeng()
{
return new Undergraduate();
}
}
class VolunteerFactory implements IFactory
{
public function createLeiFeng()
{
return new Volunteer();
}
}
$factory = new UndergraduateFactory();
$student = $factory->createLeiFeng();
$student->buyRice();
$student->sweep();
$student->wash();