设计模式,简单工厂模式

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

简单工厂模式概述

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

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

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

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

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

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

代码实现:

抽象产品角色(菜品):

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

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

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

typescript 复制代码
public class CookingChicken implements Cooking {

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

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

工厂角色

csharp 复制代码
/**
 * 简单工厂模式
 */

/**
 * 工厂类,用其中的静态方法来创建具体的烹饪菜品的任务
 */
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,来判断要创建哪个具体产品角色。在没有找到相应具体产品角色时,也做出相应的异常处理。

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

ini 复制代码
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方法,并传入具体的菜品类型,就可以返回一个需要的具体产品角色,就可以调用其具体产品角色完成指定功能。

总结

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

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

相关推荐
Loo国昌2 分钟前
【LangChain1.0】第十四阶段:Agent最佳设计模式与生产实践
人工智能·后端·算法·语言模型·架构
seven97_top7 分钟前
CopyOnWriteArrayList:写时复制机制与高效并发访问
java
不穿格子的程序员11 分钟前
设计模式篇2——观察者模式:以直播间送礼系统举例
java·观察者模式·设计模式
萤丰信息12 分钟前
四大核心技术领航,智慧园区重构产业生态新范式
java·大数据·人工智能·智慧城市·智慧园区
九号铅笔芯13 分钟前
社区评论系统设计
java·数据库·sql
J_liaty14 分钟前
客户端负载均衡与服务端负载均衡解释与对比
java·运维·负载均衡
小码过河.18 分钟前
设计模式——解释器模式
java·设计模式·解释器模式
我不是8神18 分钟前
RPC与 Thread 知识点全面总结
java·开发语言·jvm
君爱学习19 分钟前
MySQL - 基础增删查改
java
cyforkk23 分钟前
05、Java 基础硬核复习:数组的本质与面试考点
java·开发语言·面试