莫大人

设计模式之工厂模式

需求:

  项目需要对银行报文进行解析,而对应的银行有多家,后续可能有更多的银行接入,要求尽可能不要对原有代码的更改。

  很自然的想到工厂模式。

1.定义顶层解析接口

2.定义顶层提供者接口

3.编写不同的解析器

4.编写不同的解析器工厂类

5.测试

 

1.定义顶层解析接口

package com.yun.base.design.factory.service;

import java.io.InputStream;

public interface IParser {
    
    /**
     * 解析器解析方法,将输入流解析为可识别的对象 
     * @param in
     * @param target
     */
    void parse(InputStream in,Object target);
    
}

 

2.定义顶层提供者接口

package com.yun.base.design.factory.service;


public interface IProvider {

    /**
     * 解析器工厂类,专供生产解析器
     * @return 
     */
    IParser produce();
    
}

 

3.编写不同的解析器

package com.yun.base.design.factory.service.impl;

import java.io.InputStream;

import com.yun.base.design.factory.service.IParser;


public class Dom4jParser implements IParser {

    @Override
    public void parse(InputStream in, Object target) {
        System.out.println("Dom4j解析报文");
    }

}

 

package com.yun.base.design.factory.service.impl;

import java.io.InputStream;

import com.yun.base.design.factory.service.IParser;

public class SaxParser implements IParser {

    @Override
    public void parse(InputStream in, Object target) {
        System.out.println("Sax解析器解析报文");
    }

}

 

 

4.编写不同的解析器工厂类

package com.yun.base.design.factory.service.impl;

import com.yun.base.design.factory.service.IParser;
import com.yun.base.design.factory.service.IProvider;

public class Dom4jProvider implements IProvider{

    @Override
    public IParser produce() {
        return new Dom4jParser();
    }

}

 

 

5.测试

@Test
    public void test() {
        IParser dom4jParser = new Dom4jProvider().produce();
        IParser saxParser = new SaxProvider().produce();
        
        dom4jParser.parse(null, null);
        saxParser.parse(null, null);
        
    }

结果

Dom4j解析报文
Sax解析器解析报文

如果需要增加不同的解析方法,那么只需要实现顶层解析接口,实现工厂类接口,对原有接口及工厂类没有改动。

 

posted on 2017-07-21 10:15  莫大人  阅读(135)  评论(0编辑  收藏  举报

导航