简单工厂模式练习:简单工厂模式在农场系统中实现

简介: 简单工厂模式练习:简单工厂模式在农场系统中实现。

目录

前言

一、简单工厂模式

二、农场系统创建

1.先新建一个包、类以及抽象类  

2.键入各类中代码

1 抽象产品角色  Fruit

2 实现产品角色  Apple

3实现产品角色  Grape

4实现产品角色  Strawberry  (后面的步骤和前面一致  我就不一一截图了)

5工厂角色  FruitGardener

6输入异常处理  Bad FruitException

7客户端  Client

三、在主方法运行

总结


前言

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端需要传入工厂类的参数,不需要关系如何创建对象的逻辑,可以很方便地创建所需产品。下面我们来使用简单工厂模式创建一个农场管理系统


一、简单工厂模式

简单工厂模式中创建实例的方法通常为静态方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。

简单工厂模式的主要角色如下:

    • 简单工厂:简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
    • 抽象产品:简单工厂创建的所有产品的父类,负责描述所有实例共有的公共接口。
    • 具体产品:由简单工厂进行创建的具体类。

    二、农场系统创建

    1.先新建一个包、类以及抽象类  

    package : com.simokeFactory.fruit;

    抽象产品角色 抽象类 Fruit
    实现产品角色 普通类 Apple
    实现产品角色 普通类 Grape
    实现产品角色 普通类 Strawberry
    工厂角色 普通类 FruitGardener
    输入异常处理 普通类 Bad FruitException
    客户端 普通类 Client

    image.gif

    2.键入各类中代码

    1抽象产品角色  Fruit

    image.gif

    package com.simpleFactory.fruit;
    public interface Fruit {
            /*****生长*****/
            void grow();
            /*****收获*****/
            void harvest();
            /*****种植*****/
            void plant();
    }

    image.gif

    2实现产品角色  Apple

    image.gif

    package com.simpleFactory.fruit;
    public class Apple implements Fruit {
        private int treeAge;
        @Override
        public void grow() {
            log("苹果正在生长中,请耐心等待...");
        }
        @Override
        public void harvest() {
            log("苹果已到收获季,请收获...");
        }
        @Override
        public void plant() {
            log("苹果可以种植,请悉心照料...");
        }
        private static void log(String msg) {
            System.out.println(msg);
        }
        public int getTreeAge() {
            return treeAge;
        }
        public void setTreeAge(int treeAge) {
            this.treeAge = treeAge;
        }
    }

    image.gif

    3实现产品角色  Grape

    image.gif

    package com.simpleFactory.fruit;
    import java.awt.*;
    public class Grape implements Fruit{
        boolean seedless;
            @Override
            public void grow() {
                Display("葡萄正在生长中,请等待......");
            }
            @Override
            public void harvest() {
                Display("葡萄已到收获季,请收获......");
            }
            @Override
            public void plant() {
                Display("葡萄可以种植,请悉心照料......");
            }
            private static void Display(String msg) {
                System.out.println(msg);
            }
            public boolean getSeedless() {
                return seedless;
            }
            public void setSeedless(boolean seedless) {
                this.seedless = seedless;
            }
        }

    image.gif

    4实现产品角色  Strawberry  (后面的步骤和前面一致  我就不一一截图了)

    package com.simpleFactory.fruit;
    public class Strawberry implements Fruit{
        @Override
        public void grow() {
            Display("草莓正在生长中,请等待......");
        }
        @Override
        public void harvest(){
            Display("草莓已到收获季,请收获......");
        }
        @Override
        public void plant(){
            Display("草莓可以种植,请悉心照料.....");
        }
        private static void Display(String msg){
            System.out.println(msg);
        }
    }

    image.gif

    5工厂角色  FruitGardener

    package com.simpleFactory.fruit;
    import com.sun.javaws.exceptions.BadFieldException;
    public class FruitGardener {
        public static Fruit factory(String fruit) throws BadFruitException{
            if(fruit.equalsIgnoreCase("apple"))
                return new Apple();
            else if(fruit.equalsIgnoreCase("strawberry"))
            return new Strawberry();
            else if(fruit.equalsIgnoreCase("grape"))
            return new Grape();
        else
            throw new BadFruitException("Bad fruit request");
        }
        public static void factory(String fruit,String farmwork) throws BadFieldException, BadFruitException {
            if(farmwork.equalsIgnoreCase("grow")) {
                FruitGardener.factory(fruit).grow();
            }
            else if(farmwork.equalsIgnoreCase("harvest")) {
                FruitGardener.factory(fruit).harvest();
            }
            else if(farmwork.equalsIgnoreCase("plant")) {
                FruitGardener.factory(fruit).plant();
            }else if(farmwork.equalsIgnoreCase("strawberry")) {
                FruitGardener.factory(fruit).plant();
            }else if(farmwork.equalsIgnoreCase("grape")) {
                FruitGardener.factory(fruit).plant();
            }
        else
            throw new BadFruitException("Bad fruit request");
        }
    }

    image.gif

    6输入异常处理  Bad FruitException

    package com.simpleFactory.fruit;
    public class    BadFruitException extends Exception {
        public BadFruitException(String msg) {
            super(msg);
        }
    }

    image.gif

    7客户端  Client

    package com.simpleFactory.fruit;
    import com.sun.javaws.exceptions.BadFieldException;
    import java.util.Scanner;
    public class Client {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            while (true) {
                String msg1 = null;
                String msg2 = null;
                String msg3 = null;
                System.out.println("请输入水果和状态:");
                msg1 = scanner.next();
                msg2 = scanner.next();
                try {
                    FruitGardener.factory(msg1, msg2);
                } catch (BadFruitException | BadFieldException e) {
                    System.out.println("很抱歉,您的输入有误,请检查。");
                }
                System.out.println("是否继续?(Y/N)");
                msg3 = scanner.next().substring(0);
                if (msg3.equalsIgnoreCase("N"))
                    System.exit(0);
            }
        }
    }

    image.gif

    三、在主方法运行

    image.gif

    image.gif

    完成!

    总结

    扩展一下

    @Override这个标签有什么用呢?        

    1. 可以给你当作注释用,感觉这个也不能说明什么,注释也没什么用。

    2. 可以告诉读你代码的人,这是对它父类方法的重写,其实很多代码规范没有为什么,规范就是规范,代码的可读性还是很重要的。

    3. 编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。

    目录
    相关文章
    |
    网络协议 安全 网络安全
    Python网络编程详解:Socket套接字的使用与开发
    探索Python网络编程:本文详述Socket套接字,关键组件用于设备间通信。理解Socket类型(TCP/UDP),学习创建、绑定、监听、发送/接收数据步骤。示例展示服务端和客户端实现,及Socket聊天室应用。了解并发处理、错误处理和网络安全。通过学习,提升网络应用开发技能。参考书籍深入学习。
    261 2
    |
    应用服务中间件 Linux 网络安全
    linux下查找nginx.conf文件路径的方法
    nginx.conf文件在哪?云吞铺子介绍Linux系统下查找nginx.conf配置文件的方法。 查找nginx.conf 1、SSH连接Linux服务器,命令:ssh root@你的服务器IP 2、执行命令:nginx -t回车,即可看到nginx.conf文件所在目录 3、cd进入目录,vi nginx.conf编辑nginx.conf文件即可。
    8560 0
    |
    12月前
    |
    XML JSON 缓存
    深入理解RESTful API设计原则与实践
    在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
    |
    11月前
    |
    存储 人工智能 并行计算
    【AI系统】算子开发编程语言 Ascend C
    本文详细介绍了昇腾算子开发编程语言 Ascend C,旨在帮助开发者高效完成算子开发与模型调优。Ascend C 原生支持 C/C++标准,通过多层接口抽象、自动并行计算等技术,简化开发流程,提高开发效率。文章还探讨了并行计算的基本原理及大模型并行加速策略,结合 Ascend C 的 SPMD 编程模型和流水线编程范式,为读者提供了深入理解并行计算和 AI 开发的重要工具和方法。
    397 2
    |
    机器学习/深度学习 PyTorch 算法框架/工具
    【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
    【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
    |
    IDE Linux 开发工具
    IntelliJ IDEA2022破解IDEA2022.2永久破解激活教程
    IDEA 目前已经更新到最新的 2022.2.2 版本了,群里的小伙伴私聊问我,为啥之前 2021.3.1 的激活套路对新版本 2022.2.2 不管用了,是个什么情况? 很显然,IDEA 官方发现了这种破解路数,新版本加入了更严厉的反制破解。所以说,小伙伴们破解成功了以后,尽量不要升级 IDEA, 不然大概率又不行了。 好在z大又更新了新的补丁,针对最新版本,这边笔者亲测可行,仅以下文记录本人 IntelliJ IDEA 2022.2.2 版本的激活破解到 2099 年的全过程,步骤非常详细,跟着图文来就行~
    64291 3
    IntelliJ IDEA2022破解IDEA2022.2永久破解激活教程
    |
    消息中间件 网络协议 Java
    Springboot 整合RabbitMq ,用心看完这一篇就够了
    Springboot 整合RabbitMq ,用心看完这一篇就够了
    2088 0
    Springboot 整合RabbitMq ,用心看完这一篇就够了
    |
    JSON 前端开发 JavaScript
    |
    移动开发 前端开发 JavaScript
    Vue2 系列:vue.config.js 参数配置
    Vue2 系列:vue.config.js 参数配置
    1032 2
    |
    存储 算法 Serverless
    数据结构期末复习(六)查找算法
    数据结构期末复习(六)查找算法
    210 0