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

所属分类: 软件编程 / java 阅读数: 17
收藏 0 赞 0 分享

一、概念

         工厂方法模式是类的创建模式,又叫虚拟构造子模式(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数据类型的规则

这篇文章主要介绍了Java数据类型的规则的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring整合TimerTask实现定时任务调度

这篇文章主要介绍了Spring整合TimerTask实现定时任务调度的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解SpringMVC使用MultipartFile实现文件的上传

本篇文章主要介绍了SpringMVC使用MultipartFile实现文件的上传,本地的文件上传到资源服务器上,比较好的办法就是通过ftp上传。这里是结合SpringMVC+ftp的形式上传的,有兴趣的可以了解一下。
收藏 0 赞 0 分享

SpringMVC上传文件的三种实现方式

本篇文章主要介绍了SpringMVC上传文件的三种实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

本篇文章主要介绍了微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
收藏 0 赞 0 分享

浅析Java中的继承与组合

本文将介绍组合和继承的概念及区别,并从多方面分析在写代码时如何进行选择。文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用反射获取Java类中的静态变量名及变量值的简单实例

下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java启动线程的3种方式对比分析

这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringMVC上传和解析Excel方法

这篇文章主要介绍了SpringMVC上传和解析Excel方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

JAVA中String类与StringBuffer类的区别

这篇文章主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多