我是靠谱客的博主 帅气紫菜,最近开发中收集的这篇文章主要介绍设计模式(七)——工厂模式总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文转载 自http://www.hollischuang.com/archives/1430

分类

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式可以分为三类:

1)简单工厂模式(Simple Factory)

2)工厂方法模式(Factory Method)

3)抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。

GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。

简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

创建型模式

前面介绍过的三种工厂模式在设计模式的分类中都属于创建型模式。

创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。

创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

工厂模式的优点

工厂模式是创建型模式中比较重要的。

工厂模式的主要功能就是帮助我们实例化对象的。之所以名字中包含工厂模式四个字,是因为对象的实例化过程是通过工厂实现的,是用工厂代替new操作的。

这样做的好处是封装了对象的实例化细节,尤其是对于实例化较复杂或者对象的生命周期应该集中管理的情况。会给你系统带来更大的可扩展性和尽量少的修改量。

三种工厂模式之间的演化与区别

factory

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,主要是新增产品,就要修改工厂类。符合单一职责原则。不符合开放-封闭原则)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品,新增产品时不需要更改已有的工厂,需要增加该产品对应的工厂。符合单一职责原则、符合开放-封闭原则。但是引入了复杂性)

抽象工厂 :用来生产不同产品族的全部产品。(增加新产品时,需要修改工厂,增加产品族时,需要增加工厂。符合单一职责原则,部分符合开放-封闭原则,降低了复杂性)

面向对象设计的基本原则:

1)       OCP(开闭原则, Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。

2)       DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。

3)       LoD(迪米特法则, Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。

一、简单工厂模式(静态工厂模式)

要点:
1)简单工厂模式也叫静态工厂模式,就是工厂类一般使用静态方法,通过接收的参数的不同的对象的不同来返回不同的对象实例。
2)对于增加新产品无能为力!不修改代码的话,是无法扩展的。
3)一般使用较多还是简单工厂模式。

二、工厂方法模式

工厂方法模式要点:

1)为了避免简单工厂模式的缺点,不完全满足OCP(开闭原则)

2)工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

Car.java接口的源码:

 

工厂方法模式更加符合开闭原则弊端是每次扩展都会增加新的类。

三、简单工厂模式和工厂方法模式PK

1)结构复杂度

  从这个角度比较,显然简单工厂模式要占优,简单工厂模式只需要一个工厂类,而工厂方法模式的工厂类随着产品类的个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。

2)代码复杂度

   代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加更多方法(或代码)。

3)客户端编程难度

   工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。

4)管理上的难度

   这是个关键的问题。

   我们先谈扩展。众所周知,工厂方法模式完全满足OCP,即它有非常良好的扩展性。那是否就说明了简单工厂模式就没有扩展性呢?答案是否定的,简单工厂模式同样具备良好的扩展性-----扩展的时候仅需要修改少量的代码(修改工厂类的代码)就可以满足扩展性的要求了。尽管这没有完全满足OCP,但我们不需要太拘泥于设计理论,要知道,sun提供的java官方工具包中也有很多没有满足OCP的例子啊。

   然后我们从维护性的角度分析下,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。反而简单工厂没有这些问题,当多个产品类需要修改时,简单工厂模式仍然仅仅需要修改唯一的工厂类(无论怎样都能改到满足要求吧?大不了把这个类重写)。

根据设计理论建议:工厂方法模式。但实际上,我们一般都用了简单工厂模式

四、抽象工厂模式

抽象工厂模式:

1)用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)。

2)抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

上图发动机、座椅、轮胎是一个产品族,而这些产品又分为高档、中档、低档,在两个维度变化。

工厂模式要点:

1)简单工厂模式(静态工厂模式)

   虽然某种程度不符合设计原则,但实际使用最多。

2)工厂方法模式

   不修改已有类的前提下,通过增加新的工厂类实现扩展。

3)抽象工厂模式

   不可以增加产品,可以增加产品族

应用场景:

1)JDK中Calendar的getInstance方法

2)JDBC中Connection对象的获取;

3)Hibernate中SessionFactory创建Session;

4)Spring中IOC容器创建管理bean对象

5)XML解析时的DocumentBuilderFactory创建解析器对象;

6)反射中Class对象的newInstance()。

最后

以上就是帅气紫菜为你收集整理的设计模式(七)——工厂模式总结的全部内容,希望文章能够帮你解决设计模式(七)——工厂模式总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部