Java复习-20-接口(2)- 工厂设计模式

2023-11-09

工厂设计模式(Factory)

观察如下例子:
食物接口:所有食物都应该能够食用,但食用方式不同,因此包含抽象方法 eat()
面包子类:实现食物接口,实现接口中的 eat() 方法 —— “吃面包”
牛奶子类:实现食物接口,实现接口中的 eat() 方法 —— “喝牛奶”
主类中,实例化的子类向上转型为 食物接口对象,再调用 eat() 方法。

interface IFood { // 定义应该食物标准
    public void eat();  // 吃
}

class Bread implements IFood { // 定义一种食物
    public void eat(){
        System.out.println("吃面包。。。");
    }
}

class Milk implements IFood {
    public void eat(){
        System.out.println("喝牛奶。。。");
    }
}
public class JavaDemo{
    public static void main(String args[]){
        IFood food = new Bread(); // 在主类中,必须明确子类的类型
        food.eat();
    }
}

在如上的例子中,在主类中如果我们要将面包换成牛奶的话,必须在主类中修改IFood food = new Bread();的实例化语句,此时主类和子类就发生了 “耦合”

而我们以 JVM 的设计为例,java的实现可移植性的关键在于:JVM,而JVM的核心原理:利用应该虚拟机来运行java程序,所有的程序并不与具体的操作系统有任何的关联,而是由JVM来进行匹配。因此,良好的设计应该避免耦合。

因此,对于以上的例子,我们使用工厂模式来设计:
我们观察到,导致耦合的主要原因是在选择不同子类的时候,new 所进行的实例化需要变更,那我们可以将不同子类的实例化选择放入一个工厂类中,在主类中只调用工厂类,并且使用命令行的初始化参数来进行工厂类中不同子类的选择。

interface IFood { // 定义应该食物标准
    public void eat();  // 吃
}

class Bread implements IFood { // 定义一种食物
    public void eat(){
        System.out.println("吃面包。。。");
    }
}

class Milk implements IFood {
    public void eat(){
        System.out.println("喝牛奶。。。");
    }
}
class Factory {
    public static IFood getInstance(String className) {
        if ("bread".equals(className)){
            return new Bread();
        } else if ("milk".equals(className)) {
            return new Milk();
        } else {
            return null;
        }
    }
}
public class JavaDemo{
    public static void main(String args[]){
        IFood food = Factory.getInstance(args[0]); // 在主类中,必须明确子类的类型
        food.eat();
    }
}

在使用了工厂设计模式后,客户端程序类与IFood接口的子类没有任何关联,所有的关联都是通过 Factory类完成的,而在程序运行的时候可以通过初始化参数进行要使用的子类定义:

  • java JavaDemo bread
  • java JavaDemo milk

在日后进行子类扩充的时候只需要修改 Factory 程序类即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java复习-20-接口(2)- 工厂设计模式 的相关文章

随机推荐

  • Prometheus - SSL 证书过期监控

    目录 一 环境 二 部署 Exporter 2 1 配置 blackbox exporter 2 2 配置 Prometheus 2 3 Grafana 监控面板 一 环境 数据采集 Exporter blackbox exporter V
  • Java实现登录[数据库]

    和上篇的随机点名系统一样 都是使用MySQL数据库来实现 因为刚学所以写点简单例子满足下自己 需求分析 1 输入用户名和密码 2 与数据库中的记录进行比较 原理比较 简单 直接贴代码吧 import java sql Connection
  • 黑马点评给店铺类型查询业务添加缓存(List实现)

    代码如下 public Result queryShopTypeList String key CACHE SHOP TYPE KEY List 1 从Redis中查询店铺类型 获取所有 List
  • 红黑树

    1 概念 红黑树是一种近似平衡的二叉搜索树 在每个结点上增加一个存储位表示结点的颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上各个结点着色方式的限制 红黑树确保没有一条路径会比其他路径长出两倍 因而是接近平衡的 2 性质
  • 多项式回归的matlab实现

    一次函数的线性回归 首先我们回顾一下当回归函数为一次函数的情况 存在训练样本矩阵 X 该矩阵大小为m n 其中m为样本数量 n为特征数量 此时回归方程为 其中为系数向量 此时代价函数为 当代价函数取得最小值时 为最优解 对进行求导得到
  • Navicat使用教程:在Navicat Monitor for MySQL/MariaDB中配置实例

    下载Navicat Monitor最新版本 Navicat Monitor是一套安全 简单而且无代理的远程服务器监控工具 它具有强大的功能使你的监控发挥最大效用 受监控的服务器包括 MySQL MariaDB 和 Percona Serve
  • Nvidia RTX A4000 GPU 安装 515驱动记录-Ubuntu22.04

    The record of Nvidia driver installation of Nvidia RTX A4000 in ubuntu22 04 Environment Ubuntu22 04 GPU Nvidia RTX A4000
  • pytorch官方demo(LeNet)——model篇

    前言 以下文章均为学习笔记 目的是加强自己的记忆 同时希望帮助更多的学习者理解视频中的内容 是跟着一位优秀的b站up主霹雳吧啦Wz学习的 附上视频链接 2 1 pytorch官方demo Lenet 哔哩哔哩 bilibili 另外笔记是参
  • 第2章第2节练习题3 使用队列模拟渡口管理

    问题描写叙述 汽车轮渡口 过江渡船每次能载10辆车过江 过江车分为客车和货车类 上渡船有例如以下规定 1 同类车先到先上船 2 客车先于货车上渡船 其每上4辆客车 才同意放上一辆货车 3 若等待客车不足4辆 则以货车取代 4 若无货车等待
  • 利用SimpleDateFormat或者LocalDateTime生成格式为“yyyy-MM-dd HH:mm:ss“的当前时间

    java程序 利用LocalDateTime生成格式为 yyyy MM dd HH mm ss 的当前时间 DateTimeFormatter formatter DateTimeFormatter ofPattern yyyy MM dd
  • CSS3属性之text-overflow:ellipsis

    语法 text overflow clip ellipsis 默认值为clip 不显示省略标记 clip 当前对象内文本溢出时不显示省略标记 而是将溢出部分裁剪 ellipsis 当对象内文本一处时显示省略标记 一 常见的单行文本溢出显示省
  • STM32微控制器综合实训10 基于CAN总线的超声波测距仪设计实验

    实验10 基于CAN总线的超声波测距仪设计实验 利用CAN总线来实现数据的传送 文章目录 代码讲解 c8t6 温度传感器ds18b20 超声波测距 main c中的while CAN通信 代码讲解 zet6 main c 总结 代码讲解 c
  • IDEA pom.xml依赖版本号报错

    自我问题解决记录 折腾了一上午终于解决 我先按照其他解决方法都试过 没有任何反应 大家还是可以试试 1 修改maven版本号 重新下载旧版本并配置环境变量 并装了cleanLastUpdated bat小脚本去清除没有下载成功 完全的包 没
  • UC3843驱动BOOST升压电路

    充能模块通过一个UC3843芯片控制BOOST升压电路实现 由于电磁炮的发射能量与电容上储存的能量存在正相关 电容上储存的能量由于电容的容值正相关 因此本系统需要选择较大的电解电容 在实际的过程中选择了2个470uF 450V的电容进行并联
  • 【刷题】华为笔试面试机考 [HJ5] - 进制转换

    题目地址 点击跳转 题目描述 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 输入描述 输入一个十六进制的数值字符串 注意 一个用例会同时有多组输入数据 请参考帖子https www nowcoder com discuss 2
  • GAMES101-现代计算机图形学学习笔记(4)作业3

    前言 上篇作业2 本篇将更新作业3相关内容 作业3相关链接 games的作业3链接 我的源码 作业3简述 插值计算 各种shader实现 作业3相关知识笔记 Barycentric Coordinates Blinn Phong Lambe
  • 开源大数据工具汇总

    查询引擎 一 Phoenix 贡献者 Salesforce 简介 这是一个Java中间层 可以让开发者在Apache HBase上执行SQL查询 Phoenix完全使用Java编写 代码位于GitHub上 并且提供了一个客户端可嵌入的JDB
  • gRpc入门

    gRpc 一 简介 1 gprc概念 gRpc是有google开源的一个高性能的pc框架 Stubby google内部的rpc 2015年正式开源 云原生时代一个RPC标准 tips 异构系统 就是不同编程语言的系统 2 grpc核心设计
  • 解决docker在CentOs7中安装好运行不了问题

    用yum方式安装docker遇到错误的以下问题 Docker 无法启动 root localhost 桌面 yum update root localhost 桌面 yum install docker root localhost 桌面
  • Java复习-20-接口(2)- 工厂设计模式

    工厂设计模式 Factory 观察如下例子 食物接口 所有食物都应该能够食用 但食用方式不同 因此包含抽象方法 eat 面包子类 实现食物接口 实现接口中的 eat 方法 吃面包 牛奶子类 实现食物接口 实现接口中的 eat 方法 喝牛奶