设计模式中的抽象工厂模式、适配器模式、原型模式在实际项目中的实现

说明:由于项目涉及公司源码保密问题,个人上传了一份demo供大家参考和学习。

源码地址:https://gitee.com/Leelinkai/demo

1、项目概要

项目名称:商户报备系统

项目描述:满足商户各种产品(微信支付宝银联的报备功能,即每个产品支持商户创建修改查询的功能。

2、如何用设计模式做好程序设计 

2.1 抽象工厂

首先大家读完项目描述,大家可以看到,微信支持创建,修改和查询,支付宝同理。此时大家可能会想到做封装什么之类的。但是大家也要思考什么类型的设计模式适合运用到实际项目中。同时我也重点标记了字,也和产品沟通过,后续还会有QQ等产品的加入。到这里,肯定是找创建型设计模式,因此抽象工厂模式应运而生了。

既然决定使用抽象工厂模式,但是怎么去设计我们的框架接口目录呢?首先我要引入两个概念:产品族产品等级结构

  • 产品族:是指由同一个工厂产生的,位于不同产品等级结构中的一组产品
  • 产品等级结构:产品的继承结构。

 

由图可以等到,一个微信的产品的产品分别是微信创建、微信修改和微信查询,一个查询的产品等级结构分别是微信查询、支付宝查询、银联查询。所以Y轴产品族这条线是一个具体工厂,工厂提供创建、修改和查询的功能。X轴是具体产品,分别支持微信、支付宝和银联。由上述分析,我们可以初步画出UML图。

 由以上UML结构图,大家可以初步看出程序设计的基本框架了。一下是部分代码。

public interface CreateMerchant {
    public void createMch();
}

public class AlipayCreateMerchant implements CreateMerchant{

    @Override
    public void createMch() {
        System.out.println("进行了支付宝商户创建");
    }
}
 

public class UnipayCreateMerchant implements CreateMerchant{

    @Override
    public void createMch() {
        System.out.println("进行了银联商户创建");

    }
}

public class WeiXinCreateMerchant implements CreateMerchant{

    @Override
    public void createMch() {
        System.out.println("进行了微信商户创建");
    }
}

public interface ModifyMerchant {
    public void modifyMch();
}

public class AlipayModifyMerchant implements ModifyMerchant{

    @Override
    public void modifyMch() {
        System.out.println("进行了支付宝商户修改");
    }
}

public class UnipayModifyMerchant implements ModifyMerchant{

    @Override
    public void modifyMch() {
        System.out.println("进行了银联商户修改");

    }
}

public class WeiXinModifyMerchant implements ModifyMerchant{

    @Override
    public void modifyMch() {
        System.out.println("进行了微信商户修改");

    }
}

public interface FilingFactory {
    public CreateMerchant createMerchant();
    public ModifyMerchant modifyMerchant();
    public QueryMerchant queryMerchant();
}
 

public class AlipayFilingFactory implements FilingFactory{

    @Override
    public CreateMerchant createMerchant() {
        return new AlipayCreateMerchant();
    }

    @Override
    public ModifyMerchant modifyMerchant() {
        return new AlipayModifyMerchant();
    }

    @Override
    public QueryMerchant queryMerchant() {
        return new AlipayQueryMerchant();
    }

}

public class UnipayFilingFactory implements FilingFactory{

    @Override
    public CreateMerchant createMerchant() {
        return new UnipayCreateMerchant();
    }

    @Override
    public ModifyMerchant modifyMerchant() {
        return new UnipayModifyMerchant();
    }

    @Override
    public QueryMerchant queryMerchant() {
        return new UnipayQueryMerchant();
    }

}

代码没有贴的很完整。但是基本思路的代码已在。假设需要新增个QQ产品报备,是不是只需要创建个QQFlingFactory 实现 FilingFactory报备具体工厂即可。

2.2 适配器模式

背景:系统是需要提供对外接口给到内部系统使用,功能是关于请求上游这一块。但是项目进展的过程中,本身计划将别的项目继承的请求上游这一块拷贝过来,因为那个项目只负责交易相关,本项目负责商户报备,各司其职。但是遇到的困难是交易的证书和报备的证书一致,导致如果迁移过来,意味这两套证书一致,需要维护两边。为了不改这边设计好的比较合理的代码结构,决定采用设计模式的适配器模式 。

public interface RequestChannel {
    public void reqChannelCreate();

    public void reqChannelModify();

    public void reqChannelQuery();
}

public class RequestChannelAdapter implements RequestChannel{

    private OtherItemRequestChannel otherItemRequestChannel; //其他项目接口
    
    @Override
    public void reqChannelCreate() {
        System.out.println("这里是一堆请求渠道的创建商户逻辑");
        otherItemRequestChannel.reqChannelCreate();
    }
    @Override
    public void reqChannelModify() {
    }
    @Override
    public void reqChannelQuery() {
    }

}

public class AlipayCreateMerchant implements CreateMerchant{

    @Override
    public void createMch() {
        System.out.println("进行了支付宝商户创建");
        RequestChannel RequestChannel = new RequestChannelAdapter();
        RequestChannel.reqChannelCreate();
    }
}

2.3 原型模式

原型模式又名克隆模式,其目的是创建一个属性一样对象通过复制出来,而不是每次去实例化。原型模式能减少JVM的开销,提高性能等。

项目背景:有个导入表读批量数据的操作,表的一行所有的字段都是一个对象。因此采用原因模式就可以将这些对象封装起来。注意,原型模式分为浅克隆金和深克隆。使用上的差一点大家可以自行去查阅,这里不做细说。

public class Merchant implements Cloneable{
    private String name ;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    //注意这里JAVA提供的方法,创建新的对象的时候,只需要调此克隆方法,而不是实例化一个新的对象
    public Merchant clone(){
        Object object = null;
        try{
            object = super.clone();
            return (Merchant)object;
        }catch(CloneNotSupportedException e){
            return null;
        }
    }
}

以上就是我这次报备系统中考虑的要素以及采用的设计模式,设计模式还有很多类型,需要我们不断去学习去积累,更好地将其应用到项目中,让项目更加规范和易于维护。

发布了3 篇原创文章 · 获赞 0 · 访问量 67

猜你喜欢

转载自blog.csdn.net/taipoucha5799/article/details/105028632