文档章节

工厂方法模式(Factory Method Pattern)

自我修炼
 自我修炼
发布于 2017/02/09 20:56
字数 1738
阅读 3
收藏 0

工厂方法模式

1. 回顾简单工厂模式
在简单工厂模式中是把所有的产品集中到一个工厂类中创建完成,而使用者只需要关心传入工厂类的产品标识,即可创建不同的产品;并且简单工厂中提出了三角色,分别是:抽象产品角色(抽象类:abstract class,接口:interfac)是所有具体产品角色的基类、具体产品角色是创建目标、工厂角色是根据使用者传入的产品标识创建所需的产品对象实例。

简单工厂模式的弊端就是随着产品的增加,而工厂类的判断逻辑也相对越来越复杂,及其不利于扩展和维护。如何解决这个问题的哪?

2. 啥时候使用工厂方法模式
你工厂的效益越来越好,产品不断增加,生产效率不能提升,厂长很苦恼;厂长灵机一动,咱也小有资产了,咱为嘛不再搞个厂子嘛(厂长的野心比较大);于是他又搞了个专门生产苹果手机的厂子,并把原厂改为生产小米手机的厂子,这样每个厂子都负责一块生产效率上去了。

3. 工厂方法模式定义
工厂方法模式(Factory Mthod Pattern)又称为工厂模式或多态工厂模式(Polymorphic Factory),它属于类创建型模式。是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

分析:工厂方法模式提供了一个基类工厂,而基类工厂只负责生产产品的公共接口方法,具体产品的生产由具体工厂负责生产,而所有具体产品都有一个抽象产品基类。

举个例子:工厂基类就相当于一个集团,集团下辖很多的生产工厂,但是每个生产工厂只能生产一种类型的产品;

4. 该模式中包含的角色及其职责

1)、Factory:抽象工厂角色
是工厂方法模式的核心,与应用程序无关。任何在模式中创建对象的工厂必须实现这个接口。
2)、ConcreteFactory:具体工厂角色
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
3)、Product:抽象产品角色
工厂方法模式所创建对象的基类,也就是产品对象的共同父类或共同拥有的接口。
)4、ConcreteProduct:具体产品角色
这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

这里写图片描述

不废话了,看下面代码!

5. 撸代码
PHP代码哦


/** * 抽象产品角色:IProduct * */
interface IProduct
{
    /** * 抽象产品角色提供的 公共接口 创建手机 */
    public function createMobilePhone();
}
/** * 具体产品角色:ConcreteIPhoneProduct 生产苹果手机 * */
class ConcreteIPhoneProduct implements IProduct
{
    /** * 抽象产品角色提供的 公共接口 创建苹果手机 */
    public function createMobilePhone(){
        //具体实现代码
    }
}

/** * 具体产品角色:ConcreteXiaomiProduct 生产小米手机 * */
class ConcreteXiaomiProduct implements IProduct
{
    /** * 抽象产品角色提供的 公共接口 创建小米手机 */
    public function createMobilePhone(){
        //具体实现代码
    }
}
/** * 抽象工厂方法角色:IFactory * */
interface IFactory
{
    /** * 抽象工厂方法角色提供 公共接口方法 创建手机 */
    public function createMobilePhone();
}
/** * 具体工厂角色:ConcreteXiaomiFactory 生产小米手机 * */
class ConcreteXiaomiFactory implements IFactory
{
    /** * 抽象工厂方法角色提供 公共接口方法 创建小米手机 * @return IProduct */
    public function createMobilePhone(){
        return new ConcreteXiaomiProduct();
    }
}
/** * 具体工厂角色:ConcreteIPhoneFactory 生产苹果手机 * */
class ConcreteIPhoneFactory implements IFactory
{
    /** * 抽象工厂方法角色提供 公共接口方法 创建苹果手机 * @return IProduct */
    public function createMobilePhone(){
        return new ConcreteIPhoneProduct();
    }
}

/** * 测试工厂方法模式 * */
class TestFactoryMethod
{
    //测试方法
    public function Test(){
        //创建苹果手机
        $iphone = (new ConcreteIPhoneFactory())->createMobilePhone();
        //创建小米手机
        $xiaomi = (new ConcreteXiaomiFactory())->createMobilePhone();
    }
}

6. 工厂方法模式的优点
工厂方法用来创建使用者所需要的产品实例,工厂方法向使用者隐藏了对具体产品类的实例化细节,用户者之需要关心所需要的产品对应的具体工厂即可。

系统中新增产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改具体工厂和具体产品,而只需添加一个具体的工厂和具体产品即可。

7. 工厂方法模式的缺点
添加新产品时,需要编写新的具体产品类,而且还需要提供与之对应的具体工厂类,这样系统中类的个数将成对增加,在一定的程度上增加了系统的复杂度。

8. 使用场景

对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品。

只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用那个具体工厂的决定权在使用者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。

9. 总结
工厂方法模式又称为工厂模式,它属于创建型模式。是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式有四种角色,抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色组成。

工厂方法模式的具体工厂类必须有一个基类,同时具体工厂类创建的具体产品必须出自同一个基类(抽象产品角色)

新增产品类时,只需要添加具体产品类和具体工厂方法类,是成对出现的。

© 著作权归作者所有

共有 人打赏支持
自我修炼
粉丝 0
博文 9
码字总数 11400
作品 0
昆明
项目经理
私信 提问
设计模式学习之简单工厂模式

简单工厂(Simple Factory Pattern)模式又叫静态工厂方法模式(Static Factory Method Pattern) 通过一个工厂类的静态方法创建若干类的实例。创建的这些类实例都有同一个父类,且这个父类是工...

水果饮料
2016/02/16
58
0
收集的关于设计模式的java例子集合

终于有功夫坐下来把所有Design Pattern好好整理一通了,这可是个盘算了快十年的想法了。 ==============================================================================================...

晨曦之光
2012/05/21
832
0
java设计模式---三种工厂模式

工厂模式提供创建对象的接口。 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory). GOF在《设计模式〉中将工厂模式分为两类:...

jason_wu_2
2016/12/22
2
0
中国科技大学网络视频课程软件设计模式(自主模式)

中国科技大学网络视频课程软件设计模式(自主模式) 课程简介 本课程为中国科学技术大学软件学院软件工程专业选修课,学分为3;预修课程有《软件工程》/《UML建模语言》/《Java编程语言》/《...

dragonscroll
01/12
0
0
C++我也来写个工厂模式

工厂方法模式(Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质...

Micooz
2014/08/28
540
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
33分钟前
3
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
50分钟前
4
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
今天
3
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
今天
9
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部