工厂方法模式

原创 2013年12月04日 10:18:41

 

工厂方法模式的结构的组成:

1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

 

 

那么工厂方法模式是在什么场景下使用呢,下面就以本人的理解举例说明:

 

  相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。

 

  如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。

 

  这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。

 

  这种进一步抽象化的结果,使这种工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。下面就针对以上需求设计UML图:

 

首先是抽象工厂角色源代码。它声明了一个工厂方法,要求所有的具体工厂角色都实现这个工厂方法。参数type表示导出的格式是哪一种结构,如:导出HTML格式有两种结构,一种是标准结构,一种是财务需要的结构

public interface ExportFactory {
    public ExportFile factory(String type);
}

 

具体工厂角色类源代码:

public class ExportHtmlFactory implements ExportFactory{

    @Override
    public ExportFile factory(String type) {
        // TODO Auto-generated method stub
        if("standard".equals(type)){
            
            return new ExportStandardHtmlFile();
            
        }else if("financial".equals(type)){
            
            return new ExportFinancialHtmlFile();
            
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }

}

 

public class ExportPdfFactory implements ExportFactory {

    @Override
    public ExportFile factory(String type) {
        // TODO Auto-generated method stub
        if("standard".equals(type)){
            
            return new ExportStandardPdfFile();
            
        }else if("financial".equals(type)){
            
            return new ExportFinancialPdfFile();
            
        }else{
            throw new RuntimeException("没有找到对象");
        }
    }

}

 

抽象导出角色类源代码:

public interface ExportFile {
    public boolean export(String data);
}

 具体导出角色类源代码,通常情况下这个类会有复杂的业务逻辑。

public class ExportFinancialHtmlFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出财务版HTML文件");
        return true;
    }

}

 

public class ExportFinancialPdfFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出财务版PDF文件");
        return true;
    }

}

 

public class ExportStandardHtmlFile implements ExportFile{

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出标准HTML文件");
        return true;
    }

}

 

public class ExportStandardPdfFile implements ExportFile {

    @Override
    public boolean export(String data) {
        // TODO Auto-generated method stub
        /**
         * 业务逻辑
         */
        System.out.println("导出标准PDF文件");
        return true;
    }

}

 

客户端角色类源代码:

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String data = "";
        ExportFactory exportFactory = new ExportHtmlFactory();
        ExportFile ef = exportFactory.factory("financial");
        ef.export(data);
    }

}

 

 

 

 

 

  • b073ffc4-87f7-35f7-b29e-f21c3e6a01ad-thumb.jpg
  • 大小: 41.2 KB

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一...
  • jason0539
  • jason0539
  • 2014年04月07日 17:36
  • 222271

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4714

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 2889

JDK中的工厂方法模式

http://www.tuicool.com/articles/JvYR7vJ 在JDK中,也有很多使用工厂方法模式的代码。下面就介绍几个典型的用法。 Collection中的it...
  • bluetjs
  • bluetjs
  • 2016年09月05日 17:40
  • 874

利用反射机制实现工厂模式

package Reflect; interface fruit{ public abstract void eat(); } class Apple implements fruit{ ...
  • qq_27093465
  • qq_27093465
  • 2016年08月20日 00:43
  • 3026

JS学习十七天----工厂方法模式

工厂方法模式 前言 今天自己看了一下自己写的部分博客,发现写的好丑....开始注意自己的排版!!但是偏亮也不是一朝一夕就完成的,我尽量让它漂亮一点.....每天漂亮一点点     正文 工厂方法模式是...
  • shanyongxu
  • shanyongxu
  • 2015年08月16日 20:18
  • 1634

工厂方法模式的java实现例子

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接...
  • pnjlc
  • pnjlc
  • 2016年09月30日 15:17
  • 3769

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1206

Android设计模式(四)- 工厂方法模式

工厂方法模式也是创建型模式。 工厂模式根据抽象程度可以分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。使用场景任何需要生成复杂对象的地方...
  • qq_25806863
  • qq_25806863
  • 2017年03月27日 23:55
  • 1166

软件设计模式——工厂方法模式(Factory Method)

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到相应的产品中去。相应的角色如下: (1)抽象...
  • Jungle_hello
  • Jungle_hello
  • 2016年04月13日 22:51
  • 834
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)