简单工厂模式

news2024/11/19 10:24:24

简单工厂模式

所谓组件:从设计上讲,组件就是能完成一定功能的封装体。小到一个类,大到一个系统,都可以称为组件,

因为一个小系统放到更大的系统里面去,也就当个组件而已。

模式定义:

提供一个创建对象实例Factory的功能,而无须关心其具体实现。被创建实例的类型可以是接口Fruit、抽象类,也可以是具体的类Apple、Banana。

接口Fruit

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:07
 * @Description 接口的定义,该接口可以通过简单工厂来创建
 */
public interface Fruit {
    /**
     * 示意,具体功能方法的定义
     * @param s 示意,需要的参数
     */
    public void price(double s);
}

具体实现类Apple、Banana

Apple

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:07
 * @Description
 */
public class Apple implements  Fruit {

    @Override
    public void price(double s) {
        System.out.println("今日苹果的价格是"+s);
    }
}

Banana

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:16
 * @Description
 */
public class Banana implements Fruit{
    @Override
    public void price(double s) {
        System.out.println("今日香蕉的价格是"+s);
    }
}

工厂创建实例Factory

package com.xiaobao.pattern.simplefactory;

/**
 * 工厂类,用来创建Api 对象
 */
public class Factory {
    /**
     *
     * @param type 示意,从外部传入的选择条件
     * @return 创建好的Api 对象
     */
    public static Fruit buyFruit(String  type) {
        //应该根据某些条件去选择究竟创建哪一个具体的实现对象,
        //这些条件可以从外部传入,也可以从其他途径来获取。
        //如果只有一个实现,可以省略条件,因为没有选择的必要。
        //示意使用条件
        Fruit fruit = null;
        switch (type){
            case "A":
                fruit=new Apple();

                break;
            case "B":
                fruit=new Banana();

                break;
            default:
                break;

        }

        return fruit;
    }
}

测试 SimpleFactoryDemo

package com.xiaobao.pattern.simplefactory;

/**
 * @author JZB
 * @date 2023年01月12日 21:27
 * @Description
 */
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        //通过简单工厂来获取接口对象
        Fruit fruit = Factory.buyFruit("A");
        fruit.price(25.3);
    }
}

运行结果

今日苹果的价格是25.3

优点

  1. 帮助封装

简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。

  1. 解耦

通过简单工厂,实现了客户端和具体实现类的解耦。

如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。

缺点

  1. 可能增加客户端的复杂度

如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,

这样会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。

  1. 不方便扩展子工厂

私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。

不过,通常情况下是不需要为简单工厂创建子类的。

本质

简单工厂的本质是:选择实现。

使用场景

建议在以下情况中选用简单工厂。

  1. 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,

让客户端通过工厂来获取相应的接口,而无须关心具体的实现。

  1. 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,

可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。

点击下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

servlet运用自定义分发优化servlet泛滥

servlet优化 Web 层的 Servlet 个数太多了,不利于管理和编写 我们发现每一个功能都需要定义一个 servlet,一个模块需要实现增删改查功能,就需要4个 servlet,模块一多就会造成servlet 泛滥。此时我们就想 servlet 能不能像 servi…

YOLOv6 训练自己的数据集

项目地址:https://github.com/meituan/YOLOv6 论文地址:https://arxiv.org/abs/2209.02976 论文解析:http://t.csdn.cn/0ZQbV YOLOv6 是一种专为工业应用设计的单级对象检测框架,具有硬件友好的高效设计和高性能。YOLOv6-N 在 NVI…

【windows】docker与docker-compose部署spring boot项目

看完不会用,我倒立**,保姆级教学 docker部署项目 采用Dockerfile部署 docker-compose部署项目 docker-compose部署,实际上是对容器的编排,以及容器间的一些依赖 比如一个springboot项目,需要使用redis,…

深入 Redis sds

文末有视频讲解 在上一个模块中,我和小伙伴们一起学习了 Redis 最核心的命令,主要涉及 String、List、Hash、Set、Sorted Set 五种数据结构的命令,同时,我们还介绍了每种数据结构的实战场景,并带领小伙伴们使用 Java 语…

11、ThingsBoard-租户配置

1、概述 租户配置(tenant profile)如其名是租户相关的配置,通俗一点就是给你这个租户的功能增加一些限制,如果你加钱,我就给你把限制设置高一点,thingsboard官方那个收费的版本不就是这样的吗?租户配置在系统层,系统管理员可以创建租户配置,然后使用租户配置为多个租…

centos7安装kubeadm

centos7安装kubeadm 一、基础设置 1、设置主机名 hostnamectl set-hostname master hostnamectl set-hostname node01vim /etc/hosts 192.168.198.169 master 192.168.198.170 note01hostnamectl hostnamectl 是在 centos7 中新增加的命令,它是是用来管理给定主机…

2023年我花费数小时整理的Java常用类进阶学习文档,你学会了吗?

文章目录1. 基本类型的包装类1.1 概念1.2 常用的属性1.3 常用的方法1.4 自动装箱和自动拆箱2. 字符串类2.1 String 类2.2 StringBuilder类2.3 StringBuffer类2.4 StringBuilder 的扩容机制3. 数字常用类3.1 Math 类3.2 Radom 类4. 枚举类5. 日期类5.1 Date 类5.2 DateFormat 类…

基于微信小程序的小区租拼车管理信息系统小程序

文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…

学习理解10G Ethernet Subsystem之IEEE1588

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习理解10G Ethernet Subsystem之IEEE1588前言原理简介one step/two step1PPSIP 设置前言 1588大多是走在报文中,主要通过一些报文交互来完成同步过程&#xff…

在Docker中安装Gitea

目录在Docker中安装Gitea1、拉取最新Gitea官方镜像2、实例化一个Gitea容器3、Gitea需要数据源,因此使用mysql作为后端数据库4、在mysql中创建一个新数据库,起名gitea5、访问Gitea主页http://host:3000,进入初始配置页在Docker中安装Gitea 1、…

【自学Python】Python位运算符

Python位运算符 Python位运算符教程 在 Python 中,位运算符主要是用于 数值类型 的二进制的运算。 Python位运算符语法 位运算符说 明案例备注&按位与a & b返回 a 和 b 相与的结果|按位或a | b返回 a 和 b 相或的结果^按位异或a ^ b返回 a 和 b 相异或的…

FFMpeg 实现视频编码、解码

FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题->…

Java中的equals()方法和hashCode的关系

文章目录1.Java中equals()方法比较的是什么?2.equals方法和hashcode的关系3.什么是hashCode3.1 hashcode有什么作用呢?4.关于重写equals()方法的两条规范5.代码实例1.Java中equals()方法比较的是什么? 最直接的回答就是看调用equals()方法的…

联合评测 DapuStor Roealsen5 NVMe SSD在GreatSQL数据据库中的应用探索

1、合作背景 万里开源软件有限公司 ​ 北京万里开源软件有限公司,是专注于国产自主可控数据库产品研发超 20年的国家高新技术企业,参与多个国家级的数据库行业标准制定工作。本次用于测试的 GreatSQL 开源数据库是适用于金融级应用的国内自主 MySQL 版…

Redis 的基础数据结构(一) 可变字符串、链表、字典

这周开始学习 Redis,看看Redis是怎么实现的。所以会写一系列关于 Redis的文章。这篇文章关于 Redis 的基础数据。阅读这篇文章你可以了解: 动态字符串(SDS)链表字典 三个数据结构 Redis 是怎么实现的。 SDS SDS (S…

从0到1完成一个Node后端(express)项目(二、下载数据库、navicat、express连接数据库)

往期 从0到1完成一个Node后端(express)项目(一、初始化项目、安装nodemon) 下载MySQL数据库(PHPstudy) 我们这里不采用官网下载MySQL的方式、因为启动不方便,而且多版本的MySQL大家也不好去管…

【MyBatis】| MyBatis概述、MyBatis⼊⻔程序

一、MyBatis概述1. 框架在⽂献中framework被翻译为框架。Java常⽤框架:SSM三⼤框架:Spring SpringMVC MyBatisSpringBootSpringCloud等。。。。框架其实就是对通⽤代码的封装,提前写好了⼀堆接⼝和类,我们可以在做项⽬的时候直接…

Frida零基础入门教程

阅读这篇文章,不仅能了解frida是什么,还能知道如何搭建Frida运行换以及学会用frida进行简单的java/native hook实战。 Xposed大家不陌生,在手机上运行的Hook框架,Xposed插件编写完成并在手机上通过hook框架加载,打开指定应用就能实现代码注入,也就是说Xposed插件的代码是…

FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务,展示在浏览器上。

0、本文中所用软件下载包 1、前置工作 1.1 下载 ffmpeg,Download FFmpeg, 1.1.1配置ffmpeg如下图 1.1.2测试ffmpeg 安装成功:ffmpeg -version 1.1.3 使用FFmpeg获取本地摄像头设备 ffmpeg -list_devices true -f dshow -i dummy video和aud…

【JavaSE】Java到底是值传递还是引用传递?

【JavaSE】Java到底是值传递还是引用传递? 文章目录【JavaSE】Java到底是值传递还是引用传递?一:基本数据类型和引用数据类型区别二:案例1:传递基本类型2:传递引用类型三:引用传递是怎么样的&am…