文档章节

工厂方法模式(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
昆明
项目经理
收集的关于设计模式的java例子集合

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

晨曦之光
2012/05/21
813
0
设计模式学习之简单工厂模式

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

水果饮料
2016/02/16
58
0
java设计模式---三种工厂模式

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

jason_wu_2
2016/12/22
2
0
C++我也来写个工厂模式

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

Micooz
2014/08/28
540
0
中国科技大学网络视频课程软件设计模式(自主模式)

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

dragonscroll
01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(一)软件测试专题——之Linux常用命令篇01

本文永久更新地址:https://my.oschina.net/bysu/blog/1931063 【若要到岸,请摇船:开源中国 不最醉不龟归】 Linux的历史之类的很多书籍都习惯把它的今生来世,祖宗十八代都扒出来,美其名曰...

不最醉不龟归
17分钟前
3
0
蚂蚁金服Java开发三面

8月20号晚上8点进行了蚂蚁金服Java开发岗的第三面,下面开始: 自我介绍(要求从实践过程以及技术背景角度着重介绍) 实习经历,说说你在公司实习所做的事情,学到了什么 关于你们的交易平台...

edwardGe
24分钟前
7
0
TypeScript基础入门 - 函数 - this(三)

转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.4 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
34分钟前
0
0
Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
42分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
56分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部