最近开展了三次设计模式的公开课,如今来总结一下设计模式在PHP中的应用,这是第二篇建立型模式之工厂模式。设计模式
设计模式的通常介绍在第一篇文章讲了,这里就不重复。框架
工厂模式
实现:定义一个用于建立对象的接口,让子类决定实例化哪个类。
应用场景:众多子类而且会扩充、建立方法比较复杂。设计
工厂模式分为三种:简单工厂、工厂方法、抽象工厂 ,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,你们初看起来好像工厂方法增长了许多代码可是实现的功能和简单工厂同样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当须要增长新产品时也须要修改工厂代码。可是工厂方法则严格遵照开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是很是稳定的。code
/** * 优才网公开课示例代码 * * 工厂模式 * * @author 优才网全栈工程师教研组 * @see http://www.ucai.cn */ //抽象产品 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();
想了解更多,来听公开课吧:http://www.ucai.cn/train?f=17对象