一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。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(); ?>
八、区分工厂方法模式与简单工厂模式
工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了”开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。
以上就是使用php实现工厂模式的代码,还有一些关于工厂模式的概念区分,希望对大家的学习有所帮助。
本文向大家介绍学习php设计模式 php实现抽象工厂模式,包括了学习php设计模式 php实现抽象工厂模式的使用技巧和注意事项,需要的朋友参考一下 抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类。 一、意图 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接
本文向大家介绍学习php设计模式 php实现状态模式,包括了学习php设计模式 php实现状态模式的使用技巧和注意事项,需要的朋友参考一下 一、意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 状态模式变化的位置在于对象的状态 二、状态模式结构图 三、状态模式中主要角色 抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为 具体状态
本文向大家介绍学习php设计模式 php实现适配器模式,包括了学习php设计模式 php实现适配器模式的使用技巧和注意事项,需要的朋友参考一下 一、意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作 二、适配器模式结构图 三、适配器模式中主要角色 目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所
本文向大家介绍学习php设计模式 php实现策略模式(strategy),包括了学习php设计模式 php实现策略模式(strategy)的使用技巧和注意事项,需要的朋友参考一下 一、意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法 二、策略模式结构图 三、策略模式中主要角色 抽象策略(Strategy)角色
本文向大家介绍学习php设计模式 php实现享元模式(flyweight),包括了学习php设计模式 php实现享元模式(flyweight)的使用技巧和注意事项,需要的朋友参考一下 一、意图 运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销 二、享元模式结构图 三、享元模式中主要角色 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现
本文向大家介绍学习php设计模式 php实现桥梁模式(bridge),包括了学习php设计模式 php实现桥梁模式(bridge)的使用技巧和注意事项,需要的朋友参考一下 一、桥梁模式结构图 二、桥梁模式中主要角色 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象