浅析php工厂模式
本系列文章来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。
设计模式的一般介绍在第一篇文章讲了,这里就不重复。
工厂模式
实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
应用场景:众多子类并且会扩充、创建方法比较复杂。
工厂模式分为三种:简单工厂、工厂方法、抽象工厂,
三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。
/**
*工厂模式
*/
//抽象产品
interfacePerson{
publicfunctiongetName();
}
//具体产品实现
classTeacherimplementsPerson{
functiongetName(){
return"老师n";
}
}
classStudentimplementsPerson{
functiongetName(){
return"学生n";
}
}
//简单工厂
classSimpleFactory{
publicstaticfunctiongetPerson($type){
$person=null;
if($type=='teacher'){
$person=newTeacher();
}elseif($type=='student'){
$person=newStudent();
}
return$person;
}
}
//简单工厂调用
classSimpleClient{
functionmain(){
//如果不用工厂模式,则需要提前指定具体类
//$person=newTeacher();
//echo$person->getName();
//$person=newStudent();
//echo$person->getName();
//用工厂模式,则不需要知道对象由什么类产生,交给工厂去决定
$person=SimpleFactory::getPerson('teacher');
echo$person->getName();
$person=SimpleFactory::getPerson('student');
echo$person->getName();
}
}
//工厂方法
interfaceCommFactory{
publicfunctiongetPerson();
}
//具体工厂实现
classStudentFactoryimplementsCommFactory{
functiongetPerson(){
returnnewStudent();
}
}
classTeacherFactoryimplementsCommFactory{
functiongetPerson(){
returnnewTeacher();
}
}
//工厂方法调用
classCommClient{
staticfunctionmain(){
$factory=newTeacherFactory();
echo$factory->getPerson()->getName();
$factory=newStudentFactory();
echo$factory->getPerson()->getName();
}
}
//抽象工厂模式另一条产品线
interfaceGrade{
functiongetYear();
}
//另一条产品线的具体产品
classGrade1implementsGrade{
publicfunctiongetYear(){
return'2003级';
}
}
classGrade2implementsGrade{
publicfunctiongetYear(){
return'2004级';
}
}
//抽象工厂
interfaceAbstractFactory{
functiongetPerson();
functiongetGrade();
}
//具体工厂可以产生每个产品线的产品
classGrade1TeacherFactoryimplementsAbstractFactory{
publicfunctiongetPerson(){
returnnewTeacher();
}
publicfunctiongetGrade(){
returnnewGrade1();
}
}
classGrade1StudentFactoryimplementsAbstractFactory{
publicfunctiongetPerson(){
returnnewStudent();
}
publicfunctiongetGrade(){
returnnewGrade1();
}
}
classGrade2TeacherFactoryimplementsAbstractFactory{
publicfunctiongetPerson(){
returnnewTeacher();
}
publicfunctiongetGrade(){
returnnewGrade2();
}
}
//抽象工厂调用
classFactoryClient{
functionprintInfo($factory){
echo$factory->getGrade()->getYear().$factory->getPerson()->getName();
}
functionmain(){
$client=newFactoryClient();
$factory=newGrade1TeacherFactory();
$client->printInfo($factory);
$factory=newGrade1StudentFactory();
$client->printInfo($factory);
$factory=newGrade2TeacherFactory();
$client->printInfo($factory);
}
}
//简单工厂
//SimpleClient::main();
//工厂方法
//CommClient::main();
//抽象工厂
FactoryClient::main();
小伙伴们了解了php设计模式中的工厂模式了吧,是不是挺简单呢,接下来的文章我们将介绍下创建者模式