首页 > 其他分享 >简单工厂模式练习:简单工厂模式在农场系统中实现

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

时间:2023-09-17 15:31:42浏览次数:36  
标签:String void 模式 工厂 fruit 简单 Override com public


前言

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


一、简单工厂模式

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

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

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

二、农场系统创建

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

package : com.simokeFactory.fruit;

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


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

2.键入各类中代码

1 抽象产品角色  Fruit

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

package com.simpleFactory.fruit;

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

2 实现产品角色  Apple

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

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;
    }
}

3实现产品角色  Grape

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

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;
        }
    }

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);
    }
}

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");
    }
}

6输入异常处理  Bad FruitException

package com.simpleFactory.fruit;

public class    BadFruitException extends Exception {
    public BadFruitException(String msg) {
        super(msg);
    }

}

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);
        }
    }

}

三、在主方法运行

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

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

完成! 

总结

扩展一下

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

1. 可以给你当作注释用,感觉这个也不能说明什么,注释也没什么用。
2. 可以告诉读你代码的人,这是对它父类方法的重写,其实很多代码规范没有为什么,规范就是规范,代码的可读性还是很重要的。
3. 编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。


标签:String,void,模式,工厂,fruit,简单,Override,com,public
From: https://blog.51cto.com/u_16179624/7502361

相关文章

  • 简单分治快排问题解析(c++实现)
    这几天刷了需要使用分治快排思想去解决的几道比较好的题目,所以写下这篇博客用于复习和以后的复盘。什么是分治快排思想首先我们要知道什么是分治快排思想,这个思想其实就是在模拟实现qsort算法的时候使用的一个方法,在模拟实现qsort的时候,我们知道第一步是需要使用一个随意选择(三数取......
  • JS 日期比较大小的简单实例
    一 varbeginDate='2015-06-17';varendDate='2015-06-15';vard1=newDate(beginDate.replace(/\-/g,"\/"));vard2=newDate(endDate.replace(/\-/g,"\/"));if(beginDate!=""&&endDate!=""......
  • 软件设计模式系列之七——原型模式
    1模式的定义原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和动态。原型模式的关......
  • Python开发实例(二十一)智能家居控制器:模拟一个简单的智能家居控制系统,控制虚拟设备的状
    在这个实例中,我们将模拟一个简单的智能家居控制系统,通过Python代码来控制虚拟设备的状态。我们将使用一个字典来表示设备及其状态,并提供用户界面来操作这些设备。下面是一个智能家居控制器的Python程序:#初始化设备状态字典devices={'灯':'关闭','空调':'关闭',......
  • 10.HTML开发--计算器:制作一个简单的在线计算器,可以执行基本的数学运算。
    创建一个简单的在线计算器是一个很有趣的项目,它可以执行基本的数学运算,如加法、减法、乘法和除法。以下是一个基于HTML、CSS和JavaScript的计算器示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=devi......
  • 模板方法模式
    在接口中定义算法步骤,子类实现算法步骤。拉起容器时既可以通过docker,也可以通过containerd。packagemainimport"fmt"typecontainerHandlestruct{ ccontainerHandler}typecontainerHandlerinterface{ create()error start()error}func(hcontainerHandl......
  • C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题
    记录开发简单职工管理系统遇到的一些问题,黑马教程https://www.bilibili.com/video/BV1et411b73ZP147~P166头文件与源文件头文件只声明,源文件来实现(本质上是类内声明类外实现)源文件需要引用特定的头文件ifndefOOPFINAL_WORKER_H#defineOOPFINAL_WORKER_H#include<......
  • 迭代器模式
    迭代器能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。packagemainimport"fmt"typeIteratorinterface{ hasNext()bool getNext()*User}typeCollectioninterface{ createIterator()Iterator}typeUserstruct{ namestring ageint}t......
  • 设计模式7大原则
    开闭原则对扩展开放,对修改关闭。依赖倒置原则面向接口编程。单一职责原则一个类、接口、方法只负责一项职责。接口隔离原则接口中方法尽量少。迪米特法则尽量降低类与类之间的耦合。里氏替换原则引用父类的地方能使用其子类。合成复用原则尽量使用合成/聚合的方式,不是使用继......
  • 复习课5 遍写一个简单的求和程序
    一.导入上节课我们介绍了变量、常量、局部变量、全局变量的特性,接下来就让我们来编写一个简单的求和程序二.程序要求,程序需要有三个整型变量:num1num2sum,最后的求出的和保存在变量sum中,最后输出sum的值给用户(注:num1与num2数值自定)三.分析程序我们看题目就可以知道我们需要先创建......