案例分析:设计模式与代码的结构特性

Posted 19chenjian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分析:设计模式与代码的结构特性相关的知识,希望对你有一定的参考价值。

一.工厂模式概述

工厂模式,又称静态工厂模式,是用来生产对象的。在Java中,万物皆对象,对象需要创建之后才能使用,如果创建对象的时候直接new该对象,就会对该对象耦合严重,当我们更换对象的时候,所有new对象的地方都得修改一遍,显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,就只需要和工厂打交道就可以了,彻底和对象解耦,如果需要更换对象,直接在工厂里更换该对象即可,达到了解耦的目的。因此,工厂模式一个显著的优点就是解耦。

它的本质就在于实例化对象,用工厂方法来代替new操作;将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦,实现了创建者和调用者的分离。

 

二.工厂模式的分类

1.简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码);虽然某种程度不符合设计原则,但实际使用最多。

2.工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品);不修改已有类的前提下,通过增加新的工厂类实现扩展。

3.抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族);不可以增加产品,可以增加产品族。

 

三.工厂模式的应用

  ·JDK中Calendar的getInstance方法;
  ·JDBC中Connection对象的获取;
   ·Hibernate中SessionFactory创建Session;
  ·spring中IOC容器创建管理bean对象;
  ·XML解析时的DocumentBuilderFactory创建解析器对象;
  ·反射中Class对象的newInstance()

 

四.工厂方法模式的分析

简单工厂模式的扩展性不太好,而好的Java代码应该是符合开闭原则的,即对扩展开放,对修改关闭。而在简单工厂模式下,当新增一个产品类时,需要改动工厂类,产品一多,工厂类逻辑就过于复杂。在工厂方法模式中,核心的工厂类提取成为一个抽象工厂类,由对应产品的子类工厂负责创建对应的产品类对象。抽象工厂类只负责定义子类工厂需要实现的接口,不涉及具体产品类实例化的细节。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现开闭原则,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。因此,这里选用工厂方法模式来进行实现。

工厂方法模式由四个角色类组成:

  ·抽象工厂类:定义工厂类的方法,用来创建产品类

  ·具体工厂类:用于创建对应的产品对象

  ·抽象产品类:定义产品了公共的属性、方法

  ·具体产品类:实现对应产品类的属性、方法

它们之间的UML关系图如下所示:

技术图片

 

 

工厂方法模式例子:

上体育课,老师让学生们打球,可以是打篮球,可以是踢足球,可以是垫排球等等,同一个方法会对应多种不同的行为。

下面用工厂方法模式来进行实现:

第一步:定义产品类对象

技术图片

 

第二步:定义工厂类

技术图片

 

第三步:定义客户端测试

技术图片

 

 

五.工厂方法模式的优缺点

优点:

基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。加一层间接性,增加了灵活性,屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心。 多态性,客户代码可以做到与特定应用无关,适用于任何实体类。

缺点:

每增加一个产品,就需要增加一个产品工厂的类,增加了额外的开发量

 

六.总结

各种设计模式既有它各自的优点,也存在一定的缺点,在开发时可以根据需要来选择合适的设计模式。

 

 

 

 

 

 

以上是关于案例分析:设计模式与代码的结构特性的主要内容,如果未能解决你的问题,请参考以下文章

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性