设计模式之简单工厂模式

设计模式之简单工厂模式

介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

代码

回到模板方法模式的例子。一个抽象的handler类,下面有3个实现类,分别是值机CheckinHandler,选座AllocateSeatHandler,托运行李BagHandler。
BusinessHandler,定义了3个抽象方法由子类去实现,doBusiness定义了这个流程是怎么走的。

public abstract class BusinessHandler {

     public String queryPerson(){
         System.out.println("根据身份证查旅客");
         return null;
     };

    abstract boolean checkLimit();

    abstract void dobiz();

    public  void doBusiness(){
        queryPerson();
        checkLimit();
        dobiz();
    }
}

然后是3个子类
值机子类CheckInHandler

public class CheckInHandler extends BusinessHandler {
   
    boolean checkLimit() {
        System.out.println("就要检查还有没有座位,假如旅客带了行李,还要判断是否超重等等等");
        return false;
    }

    void dobiz() {
        System.out.println("分配座位号");
        System.out.println("打印登机牌");
    }
}

分配座位子类AllocateSeatHandler

public class AllocateSeatHandler extends BusinessHandler {

    boolean checkLimit() {
        System.out.println("检查是否有多余的座位,飞机的重量是否超了等");
        return false;
    }

    void dobiz() {
        System.out.println("分配座位号");
        System.out.println("更新数据库座位表啦");
    }
}

托运行李子类

public class BagHandler extends BusinessHandler {

    boolean checkLimit() {
        System.out.println("检查飞机有没有超重啦,旅客买的票能不能带这么多行李啦");
        return false;
    }

    void dobiz() {
        System.out.println("分配行李牌号");
        System.out.println("更新行李表啦");
    }
}

在真实的场景之下,我们要写一个if-else,来判断请求类型,从而判断旅客要办理的业务,进而new出来对应的handler

main

public class Main {
    public static void main(String[] args) {
    
        BusinessHandler businessHandler = null;
        if(args[0].equals("checkin")){
         businessHandler = new CheckInHandler();
        }else if (args[0].equals("seat")){
            businessHandler = new AllocateSeatHandler();
        }else if (args[0].equals("bag")){
            businessHandler = new BagHandler();
        }
        businessHandler.doBusiness();
    }

}

这样就会有问题了,我Main程序不关心你的handler是怎么创建的,是new出来呢,还是反射得到呢,而且假如新增加一个handler,假如有多个需要拿到handler的代码都需要增加一个if-else去判断。所以工厂模式就出来了,main只需要告诉工厂你需要什么对象,工厂就返回什么对象,对象怎么来的我不关心,增加handler,你只需要在修改工厂,而不需要修改多个Main程序。

修改后的代码
Main

public class Main {
    public static void main(String[] args) {

        BusinessHandler handler = HandlerFactory.createHandler(args[0]);
        handler.doBusiness();
    }
}

HandlerFactory

public class HandlerFactory {

    public static BusinessHandler createHandler(String handlerName){
        BusinessHandler businessHandler = null;
        if(handlerName.equals("checkin")){
            businessHandler = new CheckInHandler();
        }else if (handlerName.equals("seat")){
            businessHandler = new AllocateSeatHandler();
        }else if (handlerName.equals("bag")){
            businessHandler = new BagHandler();
        }
    return businessHandler;
    }


}

把创建handler的代码放到了HandlerFactory,Main只需要告诉HandlerFactory需要什么handler就可以拿到实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值