浅析php工厂模式
《浅析php工厂模式》要点: PHP实例本系列文章来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式. PHP实例设计模式的一般介绍在第一篇文章讲了,这里就不重复. PHP实例工厂模式 PHP实例实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类. PHP实例工厂模式分为三种:简单工厂、工厂办法、抽象工厂, PHP实例三种工厂的区别是,抽象工厂由多条产品线,而工厂办法只有一条产品线,是抽象工厂的简化.而工厂办法和简单工厂相对,大家初看起来好像工厂办法增加了许多代码但是实现的功能和简单工厂一样.但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码.但是工厂办法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展.在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现.只要抽象层设计的好,框架就是非常稳定的.
代码如下:
/** ?* 工厂模式 ?*/ //抽象产品 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 = new Teacher(); ????????????? // echo $person->getName(); ????????????? // $person = new Student(); ????????????? // echo $person->getName(); ????????????? // 用工厂模式,则不需要知道对象由什么类产生,交给工厂去决定 ????????????? $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); ?????? } } //简单工厂 //SimpleClient::main(); //工厂办法 //CommClient::main(); //抽象工厂 FactoryClient::main(); PHP实例小伙伴们了解了php设计模式中的工厂模式了吧,是不是挺简单呢,接下来的文章我们将介绍下创建者模式 《浅析php工厂模式》是否对您有启发,欢迎查看更多与《浅析php工厂模式》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- php – 如何在Symfony 2.4中缓存带有缓存ID和缓存生存期选项
- CakePHP 3.x – View中的AuthComponent :: user()
- PHPUnit:尝试@cover或@use不是现有的方法
- 用Php编写注册后Email激活验证的实例代码
- PHP编程:php浏览历史记录的方法
- php – Yii框架中的TCpdf不止一次加载动作
- php – 处理您的请求时出错:SQLSTATE [42S01]:基表或视图
- php – Codeigniter设置主页(默认控制器)
- PHP获取和操作配置文件php.ini的几个函数介绍
- yii使用activeFileField控件实现上传文件与图片的方法