背景:各个厂家有不同的条码,扫描的时候需要解析出不同厂家的条码,此时使用工厂模式进行设计
实现
第一步:创建一个解析条码的接口和获取不同厂家条码类型的接口
第二步:创建不同的实现类,比如EAN128码的实现、盒马生鲜条码的实现、小润发条码的实现
第三步:创建工厂类来获取不同的实现
条码接口
/**
* 条码解码接口
*
* @author Walker Han
* @date 2021/5/8 10:34
*/
public interface BarcodeDecoder {
/**
* 解析
*
* @param barcode 条码字符串
* @return 解析后的数据
*/
ArtEANPrintRecord decode(String barcode);
/**
* 可识别的条码编码类型
*
* @return 编码类型
*/
EncodeType getType();
}
条码实现
- 解析EAN128码
@Component
public class EAN128Decoder implements BarcodeDecoder {
@Override
public ArtEANPrintRecord decode(String barcode) {
return EAN128Util.decodeEAN128(barcode);
}
@Override
public EncodeType getType() {
return EncodeType.EAN128;
}
}
- 解析盒马生鲜条码
@Component
public class HmBarcodeDecoder implements BarcodeDecoder{
@Override
public ArtEANPrintRecord decode(String barcode) {
return HmBarcodeUtil.decode(barcode);
}
@Override
public EncodeType getType() {
return EncodeType.HM_BARCODE;
}
}
- 解析小润发条码
@Component
public class XrfBarcodeDecoder implements BarcodeDecoder {
@Override
public ArtEANPrintRecord decode(String barcode) {
return XrfBarcodeUtil.decode(barcode);
}
@Override
public EncodeType getType() {
return EncodeType.XRF_BARCODE;
}
}
条码工厂
public class BarcodeDecoderFactory {
private static volatile Map<String, BarcodeDecoder> uploaderMap;
private static void assignUploader() {
if (uploaderMap == null || uploaderMap.isEmpty()) {
synchronized (BarcodeDecoderFactory.class) {
if (uploaderMap == null || uploaderMap.isEmpty()) {
if (uploaderMap == null) {
uploaderMap = Maps.newHashMap();
}
Map<String, BarcodeDecoder> handlers = SpringContextUtil.getContext()
.getBeansOfType(BarcodeDecoder.class);
for (String key : handlers.keySet()) {
uploaderMap.put(handlers.get(key).getType().name(), handlers.get(key));
}
}
}
}
}
public static BarcodeDecoder getDecoder(String barcode) {
Assert.hasText(barcode, "barcode");
assignUploader();
EncodeType encodeType = EncodeType.valueOf2(barcode);
if (encodeType == null) {
return null;
} else {
return uploaderMap.get(encodeType.name());
}
}
}