PHP设计模式—工厂模式之工厂方法模式
? 定义:工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 ? 代码实例:这里还是接着上篇简单工厂模式的那个例子,改成工厂方法模式。 1、创建一个抽象类 ApptEncoder /** * 抽象类 * Class ApptEncoder */ abstract class ApptEncoder { public function encode(); } 2、创建 BloggsCal 格式处理类 * * BloggsCal 格式处理类 * Class BloggsApptEncoder class BloggsApptEncoder extends encode() { // TODO: Implement encode() method. return "Appointment data encoded in BloggsCal formatn"; } } 3、创建 MegaCal 格式处理类 * * MegaCal 格式处理类 * Class MegaApptEncoder class MegaApptEncoder return "Appointment data encoded in MegaCal formatn"; } } 4、创建工厂抽象类 CommsManager * * 工厂抽象类 * Class CommsManager CommsManager { getHeaderText(); getApptEncoder(); getFooterText(); } 5、创建 BloggsCal 工厂类 * * BloggsCal 工厂类 * Class BloggsCommsManager class BloggsCommsManager getHeaderText() { TODO: Implement getHeaderText() method. return "BloggsCal headern"; } getApptEncoder() { TODO: Implement getApptEncoder() method. return new BloggsApptEncoder(); } getFooterText() { TODO: Implement getFooterText() method. return "BloggsCal footern"; } } 6、创建 MegaCal 工厂类 * * MegaCal 工厂类 * Class MegaCommsManager class MegaCommsManager return "MegaCal headern" MegaApptEncoder(); } return "MegaCal footern"; } } 7、调用: 如果要换成 MegaCal 格式处理,直接换成 $mar = new MegaCommsManager() 就可以了 $mgr = BloggsCommsManager(); print $mgr->getHeaderText(); $mgr->getApptEncoder()->encode(); $mgr->getFooterText(); 8、结果: BloggsCal header Appointment data encoded in BloggsCal format BloggsCal footer ?总结:1、使用工厂方法模式,如果需要新增一种格式处理,就不需要修改原有的工厂类了,只需要为这些抽象类实现新的子类即可。这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这就符合了“开放-封闭原则”。 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |