首页 > 开发 > PHP > 正文

学习php设计模式 php实现工厂模式(factory)

2024-05-04 22:33:47
字体:
来源:转载
供稿:网友

一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】
二、工厂模式结构图

三、工厂模式中主要角色
抽象产品(Product)角色:具体产品对象共有的父类或接口
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例
抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。
四、工厂模式的优点和缺点
工厂模式的优点:
工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
工厂模式的缺点:
客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
五、工厂模式适用场景
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
六、工厂模式与其它模式
抽象工厂模式(abstract factory模式):Abstract Factory模式经常使用工厂方法来实现
Template Method模式: 工厂方法通常在Template Methods中被调用
七、工厂模式PHP示例

<?php/** * 抽象工厂角色 */interface Creator { public function factoryMethod();} /** * 具体工厂角色A */class ConcreteCreatorA implements Creator {  /** * 工厂方法 返回具体 产品A * @return ConcreteProductA */ public function factoryMethod() { return new ConcreteProductA(); }} /** * 具体工厂角色B */class ConcreteCreatorB implements Creator {  /** * 工厂方法 返回具体 产品B * @return ConcreteProductB */ public function factoryMethod() { return new ConcreteProductB(); }} /** * 抽象产品角色 */interface Product { public function operation();           } /** * 具体产品角色A */class ConcreteProductA implements Product {  /** * 接口方法实现 输出特定字符串 */ public function operation() { echo 'ConcreteProductA <br />'; }} /** * 具体产品角色B */class ConcreteProductB implements Product {  /** * 接口方法实现 输出特定字符串 */ public function operation() { echo 'ConcreteProductB <br />'; }} class Client {  /** * Main program. */ public static function main() { $creatorA = new ConcreteCreatorA(); $productA = $creatorA->factoryMethod(); $productA->operation();  $creatorB = new ConcreteCreatorB(); $productB = $creatorB->factoryMethod(); $productB->operation(); } } Client::main();?>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表