工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)

简介: 简单工厂模式和工厂模式的区别 简单工厂模式:也叫做静态工厂模式, 可创建多个实现类, 简单工厂模式实现了创建实现类的代码跟客户端分离, 在工厂类里面可以添加所需生成实现类的逻辑; 缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;上期我发了一篇简单工厂模式练习 简单工厂模式在农场系统中实现 没搞懂的小伙伴可以对比一下 工厂模式:每个工厂类只创建一个实现类; 如果要满足开闭原则的话, 考虑使用工厂模式,但是如果有多个实现类的话就需要创建多个工厂类, 会显得比较冗余;工厂模式(Factory

目录

前言

一、什么是工厂模式?

二、农场系统创建

1.各类概括

三、键入各类代码

1.抽象产品 角色Fruit

2.具体产品对象Apple

3. 具体产品角色Grape(后面就不一一截图了)

4.具体产品角色Srawberry

5.抽象工厂角色Fruit Gardener

6.具体工厂角色Apple Gardener

7.具体工厂角色Grape Gardener

8.具体工厂角色Strawberry Gardener

9.客户端 Client

四、在主方法中运行一下



前言

简单工厂模式和工厂模式的区别

简单工厂模式:也叫做静态工厂模式, 可创建多个实现类, 简单工厂模式实现了创建实现类的代码跟客户端分离, 在工厂类里面可以添加所需生成实现类的逻辑;

缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;

上期我发了一篇简单工厂模式练习  简单工厂模式在农场系统中实现 没搞懂的小伙伴可以对比一下

工厂模式:每个工厂类只创建一个实现类;

如果要满足开闭原则的话, 考虑使用工厂模式,但是如果有多个实现类的话就需要创建多个工厂类, 会显得比较冗余;


一、什么是工厂模式?

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。

二、农场系统创建

1.各类概括

image.gif

产品角色 抽象类 Fruit
具体产品角色 普通类 Apple
具体产品角色 普通类 Grape
具体产品角色 普通类 Strawberry
抽象工厂角色 抽象类 FruitGardener
具体工厂角色 普通类 Apple Gardener
具体工厂角色 普通类 Grape Gardener
具体工厂角色 普通类 Strawberry Gardener
客户端 普通类 Client

三、键入各类代码

1.抽象产品 角色Fruit

image.gif

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

image.gif

2.具体产品对象Apple

image.gif

package com.factorymethod.farm;
//苹果 实现 水果接口
public class Apple implements Fruit {
    private int treeAge;   //private 私人的 被private修饰的只能被本类所访问
    public void grow(){
        System.out.println("Apple is growing...");
    }
    public void harvest(){
        System.out.println("Apple has been harvested...");
    }
    public void plant(){
        System.out.println("Apple has been planted...");
    }
    public int getTreeAge() {
        return treeAge;
    }
    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
}

image.gif

3. 具体产品角色Grape(后面就不一一截图了)

package com.factorymethod.farm;
//葡萄 实现 水果接口
public class Grape implements Fruit{
    private boolean seedless;
    @Override
    public void grow() {
        System.out.println("Grape is growing...");
    }
    @Override
    public void harvest() {
        System.out.println("Grape has been harvested...");
    }
    @Override
    public void plant() {
        System.out.println("Grape has been planted...");
    }
    public boolean isSeedless() {
        return seedless;
    }
    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
}

image.gif

4.具体产品角色Srawberry

package com.factorymethod.farm;
//草莓 实现 水果接口
public class Strawberry implements Fruit{
    @Override
    public void grow() {
        System.out.println("Strawberry is growing...");
    }
    @Override
    public void harvest() {
        System.out.println("Strawberry has been harvested...");
    }
    @Override
    public void plant() {
        System.out.println("Strawberry has been planted...");
    }
}

image.gif

5.抽象工厂角色Fruit Gardener

package com.factorymethod.farm;
public interface FruitGardener {
    public Fruit factory();
}

image.gif

6.具体工厂角色Apple Gardener

package com.factorymethod.farm;
public class AppleGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Apple();
    }
}

image.gif

7.具体工厂角色Grape Gardener

package com.factorymethod.farm;
public class GrapeGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Grape();
    }
}

image.gif

8.具体工厂角色Strawberry Gardener

package com.factorymethod.farm;
public class StrawberryGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Strawberry();
    }
}

image.gif

9.客户端 Client

package com.factorymethod.farm;
import java.util.Scanner;
public class Client {
    public static void main(String[]args){
        Scanner scanner = new Scanner(System.in);
         while (true){
             String fruitname=null;
             System.out.println("请输入你要水果: ");
             Scanner in = new Scanner(System.in);
             String a = in.next();
             Fruit fruit = null;
             FruitGardener fruitGardener;
             if(a.equalsIgnoreCase("apple")){
                 fruitGardener=new AppleGardener();
                 fruit=fruitGardener.factory();
                 Apple apple =(Apple) fruit;
                 apple.setTreeAge(5);
                 System.out.println("苹果树的年龄为:"+apple.getTreeAge()+"年");
             }
             else if(a.equalsIgnoreCase("garpe")){
                 fruitGardener=new GrapeGardener();
                 fruit=fruitGardener.factory();
                 Grape grape=(Grape)fruit;
                 grape.setSeedless(true);
                 System.out.println(grape.isSeedless()==true?"葡萄无籽" : "葡萄有籽");
             }
             else if(a.equalsIgnoreCase("strawberry")){
                 fruitGardener=new StrawberryGardener();
                 fruit=fruitGardener.factory();
             }
             fruit.grow();
             fruit.harvest();
             fruit.plant();
             System.out.print("是否继续?(Y/N)");
             fruitname = scanner.next().substring(0);
             if (fruitname.equalsIgnoreCase("N")){
                 System.out.println("程序退出,再见!");
                 System.exit(0);
             }
         }
    }
}

image.gif

四、在主方法中运行一下

image.gif

image.gif

成功!

目录
相关文章
|
Java 开发工具
【开发工具】IDEA-DeBug 调试模式使用
【1月更文挑战第20天】【开发工具】IDEA-DeBug 调试模式使用
|
iOS开发 MacOS
MAC OS更新系统后IDEA中的SVN报错无法使用
MAC OS更新系统后IDEA中的SVN报错无法使用
|
分布式计算 监控 Java
Note_Spark_Day02:Standalone集群模式和使用IDEA开发应用程序
Note_Spark_Day02:Standalone集群模式和使用IDEA开发应用程序
215 0
|
移动开发 小程序 关系型数据库
java+ IDEA+ Uniapp+ mysql医院3D智能导诊系统源码
这是一个基于Java、IDEA、Uniapp和MySQL的医院3D智能导诊系统,采用Springboot后端框架和Redis、Mybatis Plus、RocketMQ等技术。系统通过对话式交互,精准推荐就诊科室,解决患者挂号困扰。它还具备智能预问诊功能,提升诊疗效率和准确性,确保医生能快速了解患者详情。此系统还支持小程序和H5,方便患者使用。
224 0
|
传感器 小程序 Java
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码 智慧校园即智慧化的校园,也指按智慧化标准进行的校园建设,按标准《智慧校园总体框架》中对智慧校园的标准定义是:物理空间和信息空间的有机衔接,使任何人、任何时间、任何地点都能便捷的获取资源和服务。
226 1
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
271 0
让VSCode的快捷键切换为WebStorm/IDEA的快捷键、修改颜色主题(深色模式)、文件图标主题
让VSCode的快捷键切换为WebStorm/IDEA的快捷键、修改颜色主题(深色模式)、文件图标主题
|
监控 应用服务中间件
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
877 0
|
Java 关系型数据库 BI
基于Java Swing 开发的网吧管理系统【eclipse和idea两个版本运行源码】
基于Java Swing 开发的网吧管理系统【eclipse和idea两个版本运行源码】
283 0
|
6月前
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
428 27