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

所属分类: 软件编程 / java 阅读数: 23
收藏 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 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多