java设计模式之工厂方法详解

 更新时间:2017年09月15日 10:36:07   作者:bateman6988  
这篇文章主要为大家详细介绍了java设计模式之工厂方法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、概念

         工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。

二、模式动机

          定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像工厂(或工厂接口)的具体工厂即可,也符合了开-闭原则。

三、模式的结构

        从上图中我们可以看出,工厂方法涉及到4个角色

       1.抽像工厂角色:该角色是工厂方法模式的核心,与应用程序无关,任何在模式中创建对像的工厂都必须实现这个接口,该角色往往是一个抽像的JAVA类或者接口。

       2.具体工厂角色:该角色实现了抽像工厂,创建具体的产品,通常由一个具体的JAVA类来实现。

       3.抽像产品角色:工厂方法模式所创建的产品的超类型,通常是一个JAVA抽像类或者JAVA接口。

       4.具体产品角色:该角色实现了抽像产品接口,工厂方法所创建的每个对像都是这个角色的实例。 

样例代码如下:

public abstract class Product 
{
 
 /**
 * @roseuid 59AA7B2D03E7
 */
 public Product() 
 {
 
 }
}


public class ConcreteProduct1 extends Product 
{
 
 /**
 * @roseuid 59AA7B2D037A
 */
 public ConcreteProduct1() 
 {
 
 }
}

public class ConcreteProduct2 extends Product 
{
 
 /**
 * @roseuid 59AA7B2D03A1
 */
 public ConcreteProduct2() 
 {
 
 }
}


public abstract class Creator 
{
 
 /**
 * @roseuid 59AA7B1600C6
 */
 public Creator() 
 {
 
 }
 
 /**
 * @return Product
 * @roseuid 59AA77070055
 */
 public abstract Product factoryMethod();
}


public class ConcreteCreator1 extends Creator 
{
 
 /**
 * @roseuid 59AA7B2D031A
 */
 public ConcreteCreator1() 
 {
 
 }
 
 /**
 * @return Product
 * @roseuid 59AA7707007B
 */
 public Product factoryMethod() 
 {
 return new ConcreteProduct1();
 }
}


public class ConcreteCreator2 extends Creator 
{
 
 /**
 * @roseuid 59AA7B2D034C
 */
 public ConcreteCreator2() 
 {
 
 }
 
 /**
 * @return Product
 * @roseuid 59AA7707009B
 */
 public Product factoryMethod() 
 {
  return new ConcreteProduct2();
 }
}

public class Client 
{
 private Creator theCreator;
 
 /**
 * @roseuid 59AA7AFC02D7
 */
 public Client() 
 {
    theCreator=new ConcreteCreator();
    Product product=thCreator.factoryMathod();
 
 }
}

四。模式样例

如现在有一个生产轮胎的工厂,该工厂可以生产benz车用的轮胎,还可以生产 bmw车子用的轮胎,后续还有可能生产audi车用的轮胎等等。由于 benz车用的轮态和bmw车子用的轮轮胎可能有比较大的差别,所用的材料和模具都会有所不同,工艺要求也不同,可以说要用不同的产品线(相当于一个子工厂)来生产(实例化),我们就可以用工厂的方法来

描述轮胎的产生过程,每个轮胎都颜色,都有寿命和胎面宽度等指标,于是我们可以抽像出一个轮胎的接口,所有的轮胎都应该是实现这个接口的类的实例,如下图所示:

当我们又增加了一条生产Audi车轮胎的产品线时,工厂方法能很好的适应,如上图我们只需增加一个AudiTire的具体产品类,然后再增加一个实例化该产品类的AudiTireFactory工厂就可以了,其它的工厂及产品类不需要做任何的修改,从此可以看出工厂方法模式对于同一产品等级下增加新的产品时是支持开闭原则的。

五、模式的约束

  该模式只针对一个产品等级结构下的产品进行有效扩展,如上例,如果我们要增一个发动机的产品,工厂类就无法适应了。

六、模式的变体与扩展

  如一个轮胎厂,他是benz旗下的子公司,他只生产benz车所使用的轮胎,那么这时抽像工厂类就没有必要了,只需要一个具体工厂就可以了,这时工厂方法模式的多态性工厂功能就退化了,如下图:

  往往工厂只需要一个实例就可以了,所以上图工厂类的factoryMethod()就可以直接改为静态的方法,这样就直接退化为了简单工厂模式。

  该工厂只生产benz车轮胎,那么轮胎的抽像接口其实也没有必要了,可以进一步退化如下图:

七、与其它模式的关系

  暂略

八、模式优缺点

    工厂方法模式,在同一个产品等级结构下,可以有效的支持开闭原则,但是不适用于增加新的产品等级结构

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java inputstream和outputstream使用详解

    Java inputstream和outputstream使用详解

    这篇文章主要介绍了Java inputstream和outputstream使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java通过SSE实现消息推送

    java通过SSE实现消息推送

    这篇文章主要为大家详细介绍了java如何通过SSE实现消息推送功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • SpringBoot如何查看和修改依赖的版本

    SpringBoot如何查看和修改依赖的版本

    这篇文章主要介绍了SpringBoot如何查看和修改依赖的版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java中的常用集合类整理

    java中的常用集合类整理

    在本篇文章里小编给大家整理的是关于java中的常用集合类的相关知识点内容,有兴趣的朋友们学习下。
    2019-12-12
  • java ant 配置及构建项目图文教程

    java ant 配置及构建项目图文教程

    以下是对java ant配置及构建项目进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 浅谈Spring中IOC的理解和认知

    浅谈Spring中IOC的理解和认知

    这篇文章主要介绍了浅谈Spring中IOC的理解和认知,想了解Spring的同学不要错过啊
    2021-04-04
  • Java中Map的遍历方法及性能测试

    Java中Map的遍历方法及性能测试

    这篇文章主要介绍了Java中Map的遍历方法及性能测试,本文讲解对HashMap、TreeMap进行对比测试,给出测试代码、测试结果和测试结论,需要的朋友可以参考下
    2015-01-01
  • 一文详解各种ElasticSearch查询在Java中的实现

    一文详解各种ElasticSearch查询在Java中的实现

    Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎,下面这篇文章主要给大家介绍了关于各种ElasticSearch查询在Java中实现的相关资料,需要的朋友可以参考下
    2023-11-11
  • Spring的@Scope注解详细解析

    Spring的@Scope注解详细解析

    这篇文章主要介绍了Spring的@Scope注解详细解析,@Scope注解主要作用是调节Ioc容器中的作用域,springboot 程序启动时会对classpath路径下的包中的类进行扫描,将类解析成BeanDefinition,需要的朋友可以参考下
    2023-11-11
  • Spring MVC实现文件上传和下载

    Spring MVC实现文件上传和下载

    这篇文章主要为大家详细介绍了Spring MVC实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论