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

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

目录

前言

一、简单工厂模式

二、农场系统创建

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下面的方法名称是否是你父类中所有的,如果没有就会报错。

    目录
    相关文章
    |
    19天前
    |
    设计模式 Java
    小谈设计模式(9)—工厂方法模式
    小谈设计模式(9)—工厂方法模式
    |
    10月前
    |
    设计模式 Java 数据库连接
    Java设计模式之抽象工厂模式:创造多个相关对象
    在软件开发领域,设计模式是一种用于解决常见问题的实践方法,它提供了一些被验证过的指导原则。抽象工厂模式是创建型设计模式中的佼佼者,可以帮助我们在处理多个相关对象的创建时保持一致性。让我们深入了解抽象工厂模式的内涵以及它如何在Java中应用。
    67 0
    |
    19天前
    |
    设计模式
    从工厂到社会:探索如何应用设计模式工厂模式
    从工厂到社会:探索如何应用设计模式工厂模式
    |
    11月前
    |
    设计模式 算法 前端开发
    【大话设计模式】-简单工厂-工厂方法-自动化实现工厂工厂方法!
    【大话设计模式】-简单工厂-工厂方法-自动化实现工厂工厂方法!
    |
    19天前
    |
    设计模式
    设计模式,简单工厂模式实现商场促销问题。
      自始至终觉得编程是一门技术,更是一门艺术,不能只满足于写完代码运行后的结果完事,还应该让后人能读懂,容易修改,容易扩展和复用。又由于自己经常写出屎山代码,所以准备苦学设计模式,尽力写出更加优雅的代码。
    |
    10月前
    |
    设计模式 Java uml
    全面通透深入剖析工厂方法模式
    工厂方法模式主要适用于以下应用场景。 (1)创建对象需要大量重复的代码。 (2)客户端(应用层)不依赖产品类实例如何被创建、实现等细节。 (3)一个类通过其子类来指定创建哪个对象。
    85 0
    |
    11月前
    |
    设计模式 前端开发 数据库
    设计模式-三个工厂
    设计模式-三个工厂
    48 0
    |
    XML 数据库 数据格式
    工厂方法模式实例公司系统
    工厂方法模式实例公司系统
    78 0
    工厂方法模式实例公司系统
    |
    设计模式 Java 程序员
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
    |
    设计模式 Java 关系型数据库
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)
    【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)