文档章节

设计模式之简单工厂模式

chenxkang
 chenxkang
发布于 2017/04/10 11:31
字数 1050
阅读 1
收藏 0

    简单工厂模式属于创建型设计模式,它提供了一种创建对象的最佳方式。

    定义:通过专门定义一个工厂类来负责创建其它类的对象,而被创建的对象通常都拥有共同的父类或共同的接口。

    问题描述:每当我们要使用到一个类时,通常会先创建这个类的对象然后再使用的,当我们同时创建多个不同类的对象时步骤就得有些繁琐。

    解决方案:定义一个工厂类Factory,专门用于创建其它类(Produce_A和Product_B)的对象,而其它类的对象通常拥有共同的父类或者共同的接口,让工厂类依赖这个父类或接口,这样就将对象的创建和使用分类开来,符合了单一职责原则。

    结构图

      

    举个栗子:讲述一个我养宠物的故事,我养了一条狗,狗喜欢吃骨头,我还养了一只猫,猫喜欢吃鱼。

    情形一:不使用简单工厂模式,按照通常的方式来实现。

    1. 新建一个类Dog,包含一个介绍狗和描述狗喜欢吃骨头的两个方法。代码如下:

         

    2. 新建一个类Cat,包含介绍猫和描述猫喜欢吃鱼的两个方法。代码如下:

         

    3. 在类SimpleFactoryFragment中分别创建狗和猫的对象,然后调用相关方法即可。代码如下:

         

    4. 运行后的效果,如下所示:

         

    情形二:使用简单工厂模式来实现,让狗类Dog和猫类Cat都实现一个共同的接口Animal,接口中封装了狗和猫的公有方法:introduce()和eatFood()。

    1. 新建一个接口Animal,包含介绍introduce()和爱吃的食物eatFood()两个方法。代码如下:

        

    2. 让类Dog和类Cat都实现接口Animal。代码如下:

    

    

    3. 新建一个工厂类AnimalFactory,专门用于创建类Dog和类Cat的对象,通过一个参数来获取需要的对象来实现功能。代码如下:

    

    4. 在类SimpleFactoryFragment中使用该工厂,通过传递类型信息来获取实体类对象来实现功能。代码如下:

        

    5. 运行后的效果同上。

  

    综上所述,简单工厂模式的实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类都拥有一个共同的父类或者接口)的对象。该模式中包含的角色有工厂、抽象产品和具体产品。

    (1)工厂是简单工厂模式的核心,它负责实现创建所有对象实例的内部逻辑。

    (2)抽象产品就是所有创建的对象的父类或接口,它负责描述所有对象实例的公有方法。

    (3)具体产品就是创建的目标对象,它负责实现具体细节。

 

    优点

    (1)工厂类将对象的创建和使用分离,符合了单一职责原则;

    (2)使用者只需要通过指定的参数在工厂类中拿到相应的具体产品,隐藏了具体产品创建的细节;

    (3)可以在不修改客户端代码的情况下更换或增加新的具体产品类。

    缺点

    (1)工厂类集中了所有具体产品创建的职责,一旦不能使用,那就会导致整个系统不能使用了;

    (2)工厂类是通过传入参数来判断创建哪个产品类对象的,一旦产品类型越来越多,那么就不利于扩展和维护了;

    (3)工厂类使用了静态方法,将无法使用继承结构。

 

    使用场景:

    (1)产品数量不多,创建逻辑比较简单;

    (2)使用者只想传入参数来获取具体产品对象,对创建细节不关心。

© 著作权归作者所有

chenxkang
粉丝 1
博文 20
码字总数 19128
作品 0
杭州
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
277
2

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
5
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部