interface
Person {
public
function
getName();
}
class
Teacher
implements
Person {
function
getName() {
return
"老师n"
;
}
}
class
Student
implements
Person {
function
getName() {
return
"学生n"
;
}
}
class
SimpleFactory {
public
static
function
getPerson(
$type
) {
$person
= null;
if
(
$type
== 'teacher') {
$person
=
new
Teacher();
}
elseif
(
$type
== 'student') {
$person
=
new
Student();
}
return
$person
;
}
}
class
SimpleClient {
function
main() {
$person
= SimpleFactory::getPerson('teacher');
echo
$person
->getName();
$person
= SimpleFactory::getPerson('student');
echo
$person
->getName();
}
}
interface
CommFactory {
public
function
getPerson();
}
class
StudentFactory
implements
CommFactory {
function
getPerson(){
return
new
Student();
}
}
class
TeacherFactory
implements
CommFactory {
function
getPerson() {
return
new
Teacher();
}
}
class
CommClient {
static
function
main() {
$factory
=
new
TeacherFactory();
echo
$factory
->getPerson()->getName();
$factory
=
new
StudentFactory();
echo
$factory
->getPerson()->getName();
}
}
interface
Grade {
function
getYear();
}
class
Grade1
implements
Grade {
public
function
getYear() {
return
'2003级';
}
}
class
Grade2
implements
Grade {
public
function
getYear() {
return
'2004级';
}
}
interface
AbstractFactory {
function
getPerson();
function
getGrade();
}
class
Grade1TeacherFactory
implements
AbstractFactory {
public
function
getPerson() {
return
new
Teacher();
}
public
function
getGrade() {
return
new
Grade1();
}
}
class
Grade1StudentFactory
implements
AbstractFactory {
public
function
getPerson() {
return
new
Student();
}
public
function
getGrade() {
return
new
Grade1();
}
}
class
Grade2TeacherFactory
implements
AbstractFactory {
public
function
getPerson() {
return
new
Teacher();
}
public
function
getGrade() {
return
new
Grade2();
}
}
class
FactoryClient {
function
printInfo(
$factory
) {
echo
$factory
->getGrade()->getYear().
$factory
->getPerson()->getName();
}
function
main() {
$client
=
new
FactoryClient();
$factory
=
new
Grade1TeacherFactory();
$client
->printInfo(
$factory
);
$factory
=
new
Grade1StudentFactory();
$client
->printInfo(
$factory
);
$factory
=
new
Grade2TeacherFactory();
$client
->printInfo(
$factory
);
}
}
FactoryClient::main();