设计模式,简单工厂模式

23种设计模式是基于面向对象的一些编程逻辑思想,无意间看了看《大话设计模式》,我觉得还挺好玩,虽然设计模式我这个阶段确实可以不着急学,但我觉得这些内容挺吸引我的,反正时间也还多,就学着玩玩。而且设计模式真的刷新了我对面向对象的认知,让我知道面向对象还可以这么灵活,还可以这么好玩,所以我觉得,作为后端的,使用面向对象语言(我学的是Java)进行程序设计,学会了这些,应该会对我编程更有帮助。

简单工厂模式概述

简单工厂模式是利用工厂类来实例化一系列对象,如此简化业务代码。

简单工厂模式由工厂角色、抽象产品角色、具体产品角色组成

使用简单工厂模式后,当需要对功能进行修改、增加、删除,主要的业务代码不需要改变:

  • 删除只需要在工厂角色中去除其实例化的代码,再删除其具体产品角色
  • 增加只需要创建一个具体产品角色,让其实现抽象产品角色的功能,再到工厂角色中增加其实例化的代码即可
  • 修改只需要在其具体产品角色中修改相应要修改的功能即可

以餐馆为顾客烹饪菜品为例:

若抽象产品角色为菜品,菜品的具体类型就是具体产品角色。对于餐馆来说,菜品的制作就是菜品的功能。

代码实现:

抽象产品角色(菜品):

/**
 * 抽象产品角色:菜品,用来表示烹饪,具体烹饪什么,要由实现类决定
 */
public interface Cooking {
    //表示制作菜品
    String cookingDish(int id);
}

抽象产品角色的定义,要是一个抽象类或接口,以便于具体产品角色来继承或实现它。在其中也要定义具体产品角色必须实现的功能。

具体产品角色(菜品的具体种类):

public class CookingChicken implements Cooking {

    @Override
    public String cookingDish(int id) {
        return "烹饪" + id + "号客户的鸡肉";
    }
}
public class CookingFish implements Cooking {
    @Override
    public String cookingDish(int id) {
        return "烹饪" + id + "号顾客的鱼";
    }
}
public class CookingPotato implements Cooking {
    public String cookingDish(int id) {
        return "烹饪" + id + "号顾客的土豆";
    }
}

具体产品角色不要忘了去实现或继承抽象产品角色,并实现其功能。

工厂角色

/**
 * 简单工厂模式
 */

/**
 * 工厂类,用其中的静态方法来创建具体的烹饪菜品的任务
 */
public class CookingFactory {
    public static Cooking createCooking(String type) throws Exception {
        Cooking cooking = null;
        switch (type){
            case "鱼":
                cooking = new CookingFish();
                break;
            case "土豆":
                cooking = new CookingPotato();
                break;
            case "鸡肉":
                cooking = new CookingChicken();
                break;
            default:
                cooking = null;
        }
        if (cooking == null) {
            System.out.println("没有此菜品");
            throw new Exception("没有此菜品");
        }
        return cooking;
    }
}

创建具体产品角色的对象的方法应该是静态的,因为这个工厂创建的方法是一种可以统一用可以复用的功能,调用它就可以创建对应的具体产品角色。所以不必要先实例化工厂类的对象再调用其工厂方法,用静态方法能简化代码。

以上为例,工厂可以通过不同的type,来判断要创建哪个具体产品角色。在没有找到相应具体产品角色时,也做出相应的异常处理。

主要业务代码(具体使用):

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入用户id号");
        int id = scan.nextInt();
        System.out.println("输入要点的菜品");
        String dish = scan.next();
        Cooking cooking = CookingFactory.createCooking(dish);
        String result = cooking.cookingDish(id);
        System.out.println(result);
    }
}

要获得指定的具体产品角色,调用其工厂类的静态工厂方法,此处调用createCooking方法,并传入具体的菜品类型,就可以返回一个需要的具体产品角色,就可以调用其具体产品角色完成指定功能。

总结

  • 简单工厂模式使得主业务代码更为简洁,只需要传入动态的代表具体产品类型的值和调用相应的功能。
  • 动态判断的逻辑代码 和 健壮性处理 以及 对象的创建 都封装在底层中,主业务代码只要完成简单的调用即可
  • 使得整个项目耦合度低,封装性强,且层次分明,易于阅读。当需要对逻辑进行一些增加、修改、删除,只需要在底层中进行即可。

举的例子可能不是很形象,一些优点的总结也可能有点片面。如有误,望指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二狗mao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值