简单工厂模式练习:简单工厂模式在农场系统中实现
目录
前言
一、简单工厂模式
二、农场系统创建
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
2.键入各类中代码
1 抽象产品角色 Fruit
package com.simpleFactory.fruit;public interface Fruit {/*****生长*****/void grow();/*****收获*****/void harvest();/*****种植*****/void plant();
}
2 实现产品角色 Apple
package com.simpleFactory.fruit;
public class Apple implements Fruit {private int treeAge;@Overridepublic void grow() {log("苹果正在生长中,请耐心等待...");}@Overridepublic void harvest() {log("苹果已到收获季,请收获...");}@Overridepublic 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
package com.simpleFactory.fruit;import java.awt.*;public class Grape implements Fruit{boolean seedless;@Overridepublic void grow() {Display("葡萄正在生长中,请等待......");}@Overridepublic void harvest() {Display("葡萄已到收获季,请收获......");}@Overridepublic 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{@Overridepublic void grow() {Display("草莓正在生长中,请等待......");}@Overridepublic void harvest(){Display("草莓已到收获季,请收获......");}@Overridepublic 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();elsethrow 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();}elsethrow 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);}}}
三、在主方法运行
完成!
总结
扩展一下
@Override这个标签有什么用呢?
1. 可以给你当作注释用,感觉这个也不能说明什么,注释也没什么用。
2. 可以告诉读你代码的人,这是对它父类方法的重写,其实很多代码规范没有为什么,规范就是规范,代码的可读性还是很重要的。
3. 编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。
简单工厂模式练习:简单工厂模式在农场系统中实现相关推荐
- 工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)
目录 前言 一.什么是工厂模式? 二.农场系统创建 1.各类概括 三.键入各类代码 1.抽象产品 角色Fruit 2.具体产品对象Apple 3. 具体产品角色Grape(后面就不一一截图了) 4.具 ...
- C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...
简单工厂模式 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespa ...
- 设计模式——工厂模式(简单工厂/工厂/抽象)
1. 简单工厂模式 1.1 定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- 工厂三兄弟之工厂方法模式
本文转载自 :http://blog.csdn.net/lovelion/article/details/9306457 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静 ...
- 设计模式的征途—4.抽象工厂(Abstract Factory)模式
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...
- java activity模式_Activity的启动模式
Android系统采用任务栈的方式来管理Activity实例. 栈是后进先出的数据结构.通常一个应用程序对应一个任务栈,默认情况下,每启动一个Activity都会入栈,处于栈顶位置.用户操作的永远都是 ...
- MS6212可替换TI PCA9306、SGM4553用于开漏模式和推拉模式的 2bit 双向电平转换器
工采网代理的MS6212是一款双向电平转换器,开漏模式和推拉模式可以用作混合电压的数字信号系统中.其使用两个独立构架的电源供电,A端供电电压范围是1.65V到5.5V,B端供电电压范围是2.3V到5. ...
- JAVA 设计模式—————— 命令模式和职责链模式
学习 Netty 前的准备工作!! 这里,还是先来复习一下 OOP (面向对象)的七大原则: 开闭原则:对扩展开放,对修改关闭 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立. 依赖倒置原 ...
最新文章
- 揭秘@爱可可:“寂寞呆子”成长记
- BCB写的简单的EXCEL合并
- 2016第51周三产品经理如何更有说服力
- 在滴滴和头条干了 2 年后端开发,太真实…
- IP通信基础 4月15日
- Mock和Java单元测试中的Mock框架Mockito介绍
- Ubuntu12.04 LTS 忘记登录密码的解决方法
- cad lisp 画四边形_多年经验总结CAD技巧6
- java is a like a_JAVA基础——is-a 、have-a、和 like-a的区别
- gem install 和 bundle 区别
- 打破硬件边界,华为EMUI分布式技术如何连接万物
- python 新建一列_创建一个空数据框并在python中填充创建的列
- 泛微OA设置系统默认水印
- 虚拟机镜像xp\win7\win10\win8\win2003,免安装系统,下载即用
- 笔记本电脑桌面的计算机图标不见了,笔记本电脑桌面图标不见了怎么办
- 近几年网络营销成功案例精选
- 对于公司的管理者,如何解决Facebook操作者离职的问题,facebook能公司统一管理吗?会不会和Facebook真实身份注册有冲突,
- 2021 美赛时间安排表
- shaper与policer
- 什么是MEID号如何申请MEID,A0、A1、A2以及99开头的MEID号的区别?
热门文章
- 不知道软件测试什么?这些是你需要知道的软件测试类型和常识
- 麻省理工学院计算机系正教授,我校教授应邀赴美国麻省理工学院等高校做主题演讲并访问交流...
- Altium Designer 21生成LOGO
- 【思维导图】“网络中心战”资料搜集
- Qt 自定义仪表盘控件
- 2021中国半导体阀市场现状及未来发展趋势
- 管理近 100 人的技术团队,不难!
- android frp分区,android系统的分区结构
- POJ 2786 Keep the Customer Satisfied 贪心
- fio裸盘读写及校验测试