工厂方法模式
2016-01-03 17:47
519 查看
描述
别名虚拟构造器,定义一个用于创建对象的接口,由子类去决定实例化哪个类,使得一个类的实例化延迟到其子类。使用场景
当一个类不知道它所必须创建的对象的类的时候当一个类希望由它的子类来指定所创建的对象的时候
结构
实现
工厂类可以设计为抽象类,但不提供工厂方法的具体实现工厂类可以设计为具体类,同时提供工厂方法的默认实现,使得其子类可以重新定义工厂方法的具体实现
参数化工厂方法
尽量避免创建工厂子类(结合模板、反射等语言特性)
代码示例
class Document { public function __construct() { echo "Document初始化...\n"; } } class MyDocument extends Document { public function __construct() { echo "MyDocument初始化...\n"; } } class OtherDocument extends Document { public function __construct() { echo "OtherDocument初始化...\n"; } } class Application { public function createDocument() { return $this->getDocument(); } protected function getDocument() { echo "获取文档对象....\n"; } } class MyApplication extends Application { protected function getDocument() { return new MyDocument(); } } class OtherApplication extends Application { protected function getDocument() { return new OtherDocument(); } } //利用反射避免工厂创建子类 class ReflectDocument extends Document { public function __construct() { echo "ReflectDocument初始化...\n"; } } class ReflectApplication { public function createDocument($className = '') { return $this->getDocument($className); } public function getDocument($className = '') { try { $class = new ReflectionClass($className); $instance = $class->newInstanceArgs(); return $instance; } catch(Exception $e) { var_dump($e->getMessage()); } } } $myApplication = new MyApplication(); $document = $myApplication->createDocument(); var_dump($document); $otherApplication = new OtherApplication(); $document = $otherApplication->createDocument(); var_dump($document); $refletApplication = new ReflectApplication(); $document = $refletApplication->createDocument("ReflectDocument"); var_dump($document);
相关文章推荐
- java18.IO操作------使用带缓冲的字节流读写数据
- response对象
- 九度OJ 1386(最值) 1387(递归) 1388(递归) 1389(递归) 1390(递归)
- Astyle编程语言格式化工具的中文说明
- 测试框架nunit之assertion断言使用详解
- notepad++如何修改当前目录为工作目录
- Lua使用笔记
- C# Cache何时使用及使用方法
- ABP理论学习之Javascript API(理论完结篇)
- web design for developers—写给程序员的web设计书--总结
- Android项目在Eclipse下的混淆
- Python Web中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具
- Linux管道思想
- bzoj1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
- WCF的一个小Demo
- java Struts2,Spring,Hibernate的整合步骤
- liunx 下把SMB加入自动启动
- php输出杨辉三角
- 从HTML form submit 到 django response是怎么完成的