工厂模式基本与简单工厂模式差不多,上面也说了,每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。

既然每次都要判断,那就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改,每次只需要修改产品子类就可以了。

同样工厂模式一般应该于程序中大部分地方都只使用其中一种产品,工厂类也不用频繁创建产品类的情况。这样修改的时候只需要修改有限的几个地方即可。

简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。客户端唯一需要知道的具体子类就是工厂子类。除了这点,基本是达到了依赖倒转原则的要求。

所以简单工厂模式一般应该于程序中大部分地方都只使用其中一种产品,工厂类也不用频繁创建产品类的情况。这样修改的时候只需要修改有限的几个地方即可。

优点:
1.隐藏了对象创建的细节,将产品的实例化推迟到子类中实现。
2.客户端基本不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,提供的类型也可以用比较便于识别的字符串。
3.方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。
4.遵循了依赖倒转原则。

缺点:
1.要求产品子类的类型差不多,使用的方法名都相同,如果类比较多,而所有的类又必须要添加一种方法,则会是非常麻烦的事情。或者是一种类另一种类有几种方法不相同,客户端无法知道是哪一个产品子类,也就无法调用这几个不相同的方法。
2.每添加一个产品子类,都必须在工厂类中添加一个判断分支,这违背了开放-封闭原则。

1、抽象工厂模式

比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品

2、工厂方法模式

抽象工厂模式就变得比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA

和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品

工厂方法模式中抽象工厂类负责创建对象的接口,具体对象的创建工作的工厂由实现工厂接口的具体类来完成。

public interface Factory {public abstract Animal createAnimal();
}
public abstract class Animal {public abstract void eat();
}
public class CatFactory implements Factory {
public Animal createAnimal() {return new Cat();}
}
public class Dog extends Animal {public void eat() {}
}
public static void main(String[] args) {Factory f = new DogFactory();f.createAnimal().eat();f = new CatFactory();f.createAnimal().eat();
}

回顾下简单工厂模式的主要内容:简单工厂模式就是实质就是专门定义了一个工厂类,利用工厂类的静态方法来根据用户需求创建对象,优点是客户端的压力较小,客户端不需要做创建实例的操作,只需要调用工厂类中的方法就可以获得对应实例,而其缺点也非常明显,其所有创建工作都在一个工厂类完成,耦合性较高,而且当系统需要增加或者修改产品时需要改动工厂类,既不符合单一职责的原则也不符合开放-关闭原则,所以就出现了工厂模式。

工厂模式是对简单工厂模式的进一步抽象化,是简答工厂模式的衍生,根据设计模式的基本原则也是设计模式的精髓“封装变化点”,即哪里发生改变就把哪里封装起来,所以工厂模式对简单工厂中的工厂类做了一个封装,使其满足单一职责和开放-关闭原则。

创建对象的三种方式

【解决问题】:简单工厂模式中违背了单一职责和开放-关闭原则。

【核心思想】:建立一个抽象工厂的基类,给每个产品建立一个工厂,该工厂继承之抽象工厂,规定每个产品都有特定的工厂来创建。

【角色】

抽象工厂角色:这是工厂模式的核心,它与应用程序无关,是具体工厂必须继承的父类或者必须实现的接口

具体工厂角色:包含逻辑业务的代码,由应用程序调用以创建对应的具体产品对象

抽象产品角色:具体产品必须继承的父类或者必须实现的接口具体产品角色:所创建的对象就是此角色的实例。

                                                              -END-

转载于:https://blog.51cto.com/14295469/2398204

分析工厂模式中的问题并改造相关推荐

  1. php总是报错,php - 简单工厂模式中的问题,总是报错

    php - 简单工厂模式中的问题,总是报错 PHPzhong2017-04-11 09:53:49 0 3 101 //接口 interface calc{ public function g ...

  2. java 工厂类静态方法,为什么要在JAVA工厂模式中使用静态方法

    工厂方法模式( Factory Method ):定义一个用于创建对象的接口 IFactory,在具体的ConcreteFactory子类中根据传进的参数即具体子类ConcreteProduct决定实 ...

  3. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  4. java不同工厂生产不同电器_完整案例分析再加知识整合——艾特抽象工厂模式,超详细的...

    抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产 ...

  5. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看 ...

  6. Discuz!NT 中的数据库链接类(重构到抽象类工厂模式)

       在7月份中我曾经写过一篇随笔叫,叫" .NET2.0 框架中的 AbstractFactory 模式 " . 里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几 ...

  7. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

  8. 手把手教你应用三种工厂模式在SpringIOC中创建对象实例【案例详解】

    目录 一.工厂模式介绍 二.通过静态工厂方法创建Bean实例 三.通过实例工厂方法创建Bean实例 四.通过自定义的factoryBean来创建bean对象 Hello,你好呀,我是灰小猿!一个超会写 ...

  9. java中的工厂模式

    一.工厂模式介绍 工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式的几种形态: (1)简单工厂(Simple Factor ...

最新文章

  1. AT91RM9200+pcf8563在linux2.6.20下的调试心得
  2. Python2与Python3的区别:
  3. 剑指offer java 博客_Java--剑指offer(10)
  4. linux eclipse svn插件安装,Linux上Eclipse安装SVN插件和安装JavaHL
  5. 计算机的桌面教案,《认识计算机桌面》教案(4页)-原创力文档
  6. ASP.NET Callback 回调实用讲解
  7. 关于企业应用SAP成本管理模式与方法的一些思考
  8. 机器学习实战 基于_基于ScikitLearn、Keras和TensorFlow的机器学习实战:分类
  9. 一些有趣的 CSS 魔法和布局(下)(结尾有岗位内推哦~)
  10. python searchsorted_Python 二分查找与 bisect 模块
  11. winform自定义消息提示框定时自动关闭
  12. 是否要从单片机转为嵌入式Linux?
  13. 最好用AI抠图的软件,方便你,我,他。
  14. 【DSP入门】DSP2803x算法加速利器之CLA
  15. 微信网页版打不开怎么办?这里有官方解决办法!
  16. SharePoint - 如何查询SharePoint ID?
  17. 计算机网络技术组装与维护,计算机组装与维护计算机网络技术(组网)()课程标准(范文).doc...
  18. 移动硬盘安装ubuntu系统二——启动U盘安装
  19. module ‘win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9‘ has no attribute ‘CLSIDToClassM
  20. 2022-2028年中国喷砂设备行业发展动态及投资前景分析报告

热门文章

  1. python 字典操作
  2. Jacob Java程序把Word文档直接转换成Html文件
  3. .在OnPaint()函数和在OnEraseBkgnd()重绘图的区别
  4. ASP.NET 2.0 学习笔记 1: session 与 script 应用
  5. 用Axis创建的Webservice的集成与发布
  6. 操作软件_如何提升办公软件的操作能力
  7. Docker日志大小限制
  8. 苹果电脑显示500服务器错误,VS For Mac 运行项目出现 HTTP 500错误
  9. java如何解决高并发问题_java怎么处理高并发?
  10. MySQL where后面的标量子查询使用