工厂模式+策略模式的使用

本文探讨了在面对多个条件分支时,如何运用策略模式和工厂模式提高代码的可读性和可维护性。通过实例展示了如何将冗长的if-else语句替换为策略模式,再结合工厂模式创建具体的策略,从而简化代码结构。

项目中会有这样的情形,通过某个参数进入不同的if分支,但是if分支太多就会导致项目难以维护,可读性也会降低,如下情形:

public class Test {
    public static void main(String[] args) {
        String ani = "pig";
        if(ani.equals("cat")){
            showCat();
        }else if(ani.equals("dog")){
            showDog();
        }
        
    }

    private static void showCat() {
        System.out.println("this is cat!");
    }

    private static void showDog() {
        System.out.println("this is dog!");
    }
}

上面情况为了方便只写了两个if的情况,假设if有十个,这时候是时候引入策略模式了

public interface Operate {
    void show();
}

不同的分支实现该策略接口

public class CatShow implements Operate {
    @Override
    public void show() {
        System.out.println("this is cat!");
    }
}
public class DogShow implements Operate {
    @Override
    public void show() {
        System.out.println("this is dog!");
    }
}

使用工厂模式生成不同的策略

public class ShowFactory {

    public static final String DOG = "dog";
    public static final String CAT = "cat";

    private static ShowFactory factory = new ShowFactory();

    private ShowFactory(){
    }

    private static Map<String,Operate> strategyMap = new HashMap<>();
    static{
        strategyMap.put(DOG, new DogShow());
        strategyMap.put(CAT, new CatShow());
    }
    public Operate creator(String animal){
        return strategyMap.get(animal);
    }
    public static ShowFactory getInstance(){
        return factory;
    }
}
public static void main(String[] args) {
        String ani = "dog";
        Operate creator = ShowFactory.getInstance().creator(ani);
        creator.show();
}

打印结果和if else的代码一样

工厂模式策略模式结合可有效实现审批功能,提高代码复用性与可维护性。以下为具体实现方法: ### 定义审批策略接口 先定义一个通用审批接口,此接口包含审批操作的方法。以引用[3]为例,可定义审批接口如下: ```java public interface AuditStrategyService { void approve(String userId, String id); } ``` ### 实现具体审批策略 为不同审批类型(如购买审批、订单审批)实现具体审批策略类,这些类需实现上述审批接口。 ```java // 购买审批策略类 public class PurchaseAuditStrategy implements AuditStrategyService { @Override public void approve(String userId, String id) { // 实现购买审批的具体逻辑 System.out.println("进行购买审批,用户ID: " + userId + ",审批ID: " + id); } } // 订单审批策略类 public class OrderAuditStrategy implements AuditStrategyService { @Override public void approve(String userId, String id) { // 实现订单审批的具体逻辑 System.out.println("进行订单审批,用户ID: " + userId + ",审批ID: " + id); } } ``` ### 创建审批策略工厂 创建一个工厂类,依据不同审批类型创建对应的审批策略对象。 ```java import java.util.HashMap; import java.util.Map; public class AuditStrategyFactory { private static final Map<String, AuditStrategyService> strategyMap = new HashMap<>(); static { strategyMap.put("purchase", new PurchaseAuditStrategy()); strategyMap.put("order", new OrderAuditStrategy()); } public static AuditStrategyService getAuditStrategy(String auditType) { return strategyMap.get(auditType); } } ``` ### 使用工厂和策略进行审批操作 在业务层使用工厂类获取具体审批策略对象,然后执行审批操作。 ```java public class AuditService { public void performAudit(String auditType, String userId, String id) { AuditStrategyService auditStrategy = AuditStrategyFactory.getAuditStrategy(auditType); if (auditStrategy != null) { auditStrategy.approve(userId, id); } else { System.out.println("未找到对应的审批策略,审批类型: " + auditType); } } } ``` ### 调用示例 ```java public class Main { public static void main(String[] args) { AuditService auditService = new AuditService(); // 进行购买审批 auditService.performAudit("purchase", "123", "456"); // 进行订单审批 auditService.performAudit("order", "789", "101"); // 尝试不存在的审批类型 auditService.performAudit("unknown", "111", "222"); } } ``` 通过以上步骤,利用工厂模式策略模式实现了审批功能。不同审批类型的具体逻辑封装在各自策略类中,工厂类负责创建和管理这些策略对象,提高了代码的可维护性和扩展性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值