设计模式—工厂方法模式 设计模式—简单工厂

工厂方法模式让父类在不知道具体实现的状况下成本身功能的调用。实现方法是经过子类继承父类的抽象方法来获取被调用子类。(这里有些DI的味道)html

    优点:一、能够在不知道具体调用和实现的状况下进行编程java

       二、更加容易扩展新版本编程

    劣势:一、在客户端须要和具体的产品对象进行耦合,在调用处必需要知道须要调用的具体类。(能够组合简单工厂模式避免)设计模式

示例说明:  客户端要进行文件导出,文件的类型有多种,这里只简单的列出两种txt和DB类型。ExportFileOperator是不知道具体要对那种文件进行导出的,只ide

       有客户端在进行调用的时候才知掉要对哪一种类型文件进行导出。post

类图以下:测试

 

下面看具体实现代码:url

ExportFileApi:定义全部文件的标准,必须有export(File file)方法。spa

package com.zpj.designMode.FactoryMethodPattern;

import java.io.File;

/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:10:46
 * @version :1.1
 * 
 */
public interface ExportFileApi {

    public void export(File file);
}

 

 ExportDBFile:DB文件导出实现类设计

package com.zpj.designMode.FactoryMethodPattern;

import java.io.File;

/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:12:35
 * @version :1.1
 * 
 */
public class ExportDBFile implements ExportFileApi {

    @Override
    public void export(File file) {
        System.out.println("-------开始导出DB文件---------");
    }

}

 

 ExportTxtFile:txt文件导出实现类

package com.zpj.designMode.FactoryMethodPattern;

import java.io.File;

/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:12:35
 * @version :1.1
 * 
 */
public class ExportTxtFile implements ExportFileApi {

    @Override
    public void export(File file) {
        System.out.println("-------开始导出txt文件---------");
    }

}

 ExportFileOperator:由客户端直接调用的导出操做类,在原本中不实现导出操做,由其子类具体实现。

package com.zpj.designMode.FactoryMethodPattern;

import java.io.File;

/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:14:25
 * @version :1.1
 * 
 */
public abstract class ExportFileOperator {

    public void export(File file){
        ExportFileApi efa = FactoryMethod();//获取须要导出的文件类型
        efa.export(file);//调用自身的export()进行导出操做
    }

    public abstract ExportFileApi FactoryMethod();
}

ExportDBFileOperator:继承public abstract ExportFileApi FactoryMethod();,向调用处返回ExportDBFile类型对象

package com.zpj.designMode.FactoryMethodPattern;
/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:18:46
 * @version :1.1
 * 
 */
public class ExportDBFileOperator extends ExportFileOperator{

    @Override
    public ExportFileApi FactoryMethod() {
        return new ExportDBFile();
    }

}

 

 ExportTxtFileOperator:继承public abstract ExportFileApi FactoryMethod();,向调用处返回ExportTxtFile类型对象

package com.zpj.designMode.FactoryMethodPattern;
/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:18:46
 * @version :1.1
 * 
 */
public class ExportTxtFileOperator extends ExportFileOperator{

    @Override
    public ExportFileApi FactoryMethod() {
        return new ExportTxtFile();
    }

}

 

 ClientTest:客户端进行调用导出文件。

package com.zpj.designMode.FactoryMethodPattern;

import java.io.File;

import org.junit.Test;

/**
 * @author PerKins Zhu
 * @date:2016年8月28日 上午10:21:50
 * @version :1.1
 * 
 */
public class ClientTest {

    File file = new File("G:\\test\\test.txt");
    
    //版本1测试
    @Test
    public void test01(){
        //这里能够根据须要导出的文件实例化相应的operator对象
        ExportFileOperator txtFileOperator = new ExportTxtFileOperator();
        txtFileOperator.export(file);
        
        ExportFileOperator DBFileOperator = new ExportDBFileOperator();
        DBFileOperator.export(file);
        
        //在这里能够和简单工厂模式进行组合,根据配置文件或者参数实例化不一样的operator,见:http://www.cnblogs.com/PerkinsZhu/p/5813644.html
    }
}

 

 若是须要添加xml文件类型,需添加一个ExportFileApi的实现类 ExportXMLFile,实现自身的导出操做 export(File file);

            一个ExportFileOperator的子类ExportXMLFileOperator,实现ExportXMLFile的调用方法public ExportFileApi FactoryMethod() 。

这样在客户端处便可对xml文件进行调用。

 

若是在调用处整合工厂方法模式便可经过参数或者配置文件来下降耦合度。见:设计模式—简单工厂

   

*
 *----------Dragon be here!----------/
 *    ┏┓   ┏┓
 *   ┏┛┻━━━┛┻┓
 *   ┃       ┃
 *   ┃   ━   ┃
 *   ┃ ┳┛ ┗┳ ┃
 *   ┃       ┃
 *   ┃   ┻   ┃
 *   ┃       ┃
 *   ┗━┓   ┏━┛
 *     ┃   ┃神兽护体,Code is far away from bug with the animal protecting
 *     ┃   ┃代码无BUG!
 *     ┃   ┗━━━┓
 *     ┃       ┣┓
 *     ┃       ┏┛
 *     ┗┓┓┏━┳┓┏┛
 *      ┃┫┫ ┃┫┫
 *      ┗┻┛ ┗┻┛
 * ━━━━━━神兽出没━━━━━━
相关文章
相关标签/搜索