设计模式,简单工厂模式

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

总结

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

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

相关推荐
一 乐1 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
爱记录的小磊1 小时前
java-selenium自动化快速入门
java·selenium·自动化
鹏码纵横1 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
weixin_985432111 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
Mr Aokey1 小时前
Java UDP套接字编程:高效实时通信的实战应用与核心类解析
java·java-ee
冬天vs不冷1 小时前
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
java·开发语言
hong_zc1 小时前
Java 文件操作与IO流
java·文件操作·io 流
猎人everest2 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
木棉软糖2 小时前
【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
java·maven·intellij-idea
秋田君3 小时前
深入理解JavaScript设计模式之策略模式
javascript·设计模式·策略模式