浅谈设计模式之工厂模式

news2024/11/28 0:58:05

0 工厂模式的介绍

工厂模式属于创建型模式,是Java中最常见的设计模式之一。工厂模式提供了一种将对象的实例化过程封装在工厂类的方式,通过工厂模式可以屏蔽掉对象的创建过程,对外提供了一种统一的接口来创建不同类型的对象。

优点:

  • 一个调用者想创建一个对象只需要知道其名称即可
  • 可扩展性高,新增一个产品只需要扩展一个工厂类

缺点:

  • 每增加一个产品时都需要增加一个对象实现工厂和实现类,这使得系统中类的数量增加,一定程度上增加了系统类的复杂程度。

1 核心角色

工厂模式中包含了一下几个核心角色:

  • 抽象产品:定义了产品的共同接口或者抽象类。抽象产品可以是所有具体产品的父类或接口,表示所有具体产品共有的方法。
  • 具体产品:实现抽象产品接口,定义具体产品特定的行为。
  • 工厂类:用于声明创建产品的抽象方法,一个工厂内可以声明多个不同产品的抽象方法。
  • 工厂对象:工厂类的实例化对象,负责创建具体产品的对象。

2 实现案例

创建一个 Shape 接口和实现 Shape 接口的实体类。然后定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
在这里插入图片描述

2.1 创建接口Shape

public interface Shape {
    void draw();
}

2.2 创建实现接口的实现类

矩形实现类:

public class Rectangle implements Shape{
    @Override
    public void draw() {
        System.out.println("矩形~");
    }
}

圆形实现类:

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("圆形~");
    }
}

正方形实现类:

public class Square implements Shape{
    @Override
    public void draw() {
        System.out.println("正方形~");
    }
}

2.3 创建工厂类,生成指定产品的实体类对象

public class ShapeFactory {

    //使用getShape方法获取对应的形状类型
    public Shape getShape(String shapeType) {
        if(shapeType == null) return  null;
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else {
            return new Square();
        }
    }
}

2.4 创建工厂对象,调用具体产品的对象方法

public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        //获取圆形的对象,并调用draw方法
        Shape circle = shapeFactory.getShape("CIRCLE");
        circle.draw();

        //获取矩形的对象,并调用draw方法
        Shape rectangle = shapeFactory.getShape("RECTANGLE");
        rectangle.draw();

        //获取正方形的对象,并调用draw方法
        Shape square = shapeFactory.getShape("SQUARE");
        square.draw();
    }
}

3 输出结果

在这里插入图片描述

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

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

相关文章

数据结构01-线性结构-链表栈队列-队列篇

文章目录 参考:总结大纲要求线性结构-队列QQ号码解密 参考: 总结 本系列为C数据结构系列,会介绍 线性结构,简单树,特殊树,简单图等。本文为线性结构部分。 大纲要求 线性结构 【 3 】链表:单…

在线版PS就选这5个!能免费使用

虽然AdobePhotoshop作为专业的图形编辑工具为设计师带来了很多便利,但是它下载繁琐,费用昂贵的特性也让很多设计师望而却步。本文精心整理了5款能作为在线PS使用的设计工具,不仅能减轻操作设备的内存负担,而且可以免费使用&#x…

Java阶段五Day07

Java阶段五Day07 文章目录 Java阶段五Day07问题解析dubbo和nacos Dubbo负载均衡负载均衡介绍准备一个负载均衡的环境Dubbo负载均衡策略配置负载均衡的方式dubbo配置负载均衡优先级微服务阶段性架构 Spring Boot Starter自定义配置准备一个starter案例项目Spring框架版本迭代案例…

K8S安全风险及防护建议

Kubernetes(K8S)是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。一个Kubernetes集群通常包含跨多台计算机运行的控制平面和多个工作节点(node),控…

415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入&#xff…

被问懵了,加密后的数据如何进行模糊查询?

我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。 为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有:密码、手机号、电话号码、…

【中危】Apache Accumulo 身份认证过程缺陷

漏洞描述 Apache Accumulo是一个排序分布式的 Key-Value 存储应用。 在Apache Accumulo 2.1.0版本中,AccumuloClient 在构造新的实例时移除了自动身份验证机制,身份验证始终在 shell 中进行。当 shell 闲置时间过长,需要重新进行身份验证时&…

前端调整滚动条的外观样式

前端调整滚动条的外观样式 css主要分三个步骤 1、设置滚动条宽度 ::-webkit-scrollbar { width: 5px; } 效果:分别设置50px和5px宽度 2、设置里面小滑块的样式 ::-webkit-scrollbar-thumb {border-radius: 5px;-webkit-box-shadow: inset 0 0 5px rgba(0,0,0…

编程导航算法通关村第 1关 | 两个链表的第一个公共节点

编程导航算法通关村第 1关 | 白银挑战 剑指 Offer 52. 两个链表的第一个公共节点 集合/map 将headA中的链表,放在一个set集合中, 依次遍历headB, headB中第一个包含在set集合中的节点就是第一个公共子节点 ListNode getIntersectionNode(L…

网络安全专业必考的三个证书,初学者建议收藏!

学习网络安全,有三个必考证书,最后一个人手一本! 一,NISP证书 NISP即国家信息安全水平考试,由中国信息安全测评中心发证,属于网络安全专业的必考证书。 只有考取NISP一级证书才有机会考取二级&#xff0…

【动手学深度学习】--10.卷积神经网络

文章目录 卷积神经网络1.从全连接层到卷积1.1全连接层1.2平移不变性1.3局部性1.4卷积 2.卷积层2.1互相关计算2.2卷积层2.3图像中目标的边缘检测2.4学习卷积核 3.填充和步幅3.1填充3.2步幅 4.多输入多输出通道4.1多输入通道4.2多输出通道4.3 11卷积层 5.池化层5.1池化层5.2填充和…

设计准则必备:学习UI设计规范的五大黄金法则

看到好看的设计,随手保存起来,这是设计师的基本习惯。但是如果只是好看,并不能驱使受众真正去了解产品。如果想要用户动心,还是需要了解一些设计心理学,从用户心理去引导用户行为。今天给大家分享一些常用的设计法则帮…

对话网易伏羲赵增:开源VS自研?哪条路是通向AIGC的捷径?|WAIC2023

点击关注 文 | 郝鑫、黄小艺 从去年底到现在,国内外肉眼可见地涌现出了一批文生图公司,这背后与基础架构开源有很大关系。 2022年8月,Stability.AI在GitHub上公开开源了Stable Diffusion模型的代码和训练数据集;当月底&#xf…

linux系统编程-文件系统

目录 1文件存储 1.1 inode 1.2 dentry 2.文件系统 2.1 stat函数 2.2 lstat函数 2.3特殊权限位、黏住位 2.4 access函数 2.5 chmod函数 2.6 truncate函数 2.7 link函数 2.8 unlink函数、 2.9 隐式回收 2.10 symlink函数 2.11 readlink函数 2.12 rename函数 2.1…

Java 常用的重构技巧指南 v1.0

前段时间,leader 在 review 代码的时候发现了代码中 存在的一部分的问题,导致 代码的复杂度太高了,包括大部分的sql 都是属于慢sql ,还是在建立了索引的情况下 , 代码的流程过于臃肿,而且本人编码的习惯,习…

Mybatis-Plus(一)--Mybatis-Plus介绍与快速入门

阅读这篇文章之前确保你已经学过springboot和mybatis 一.Mybtis-Plus介绍 【1】Mybatis-Puls(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发,提高效率而生。 简单说就是其实很多sql语…

IntelliJ IDEA下载安装教程

目录 友情提醒第一章、IDEA软件下载1.1)官网下载 第二章、IDEA软件安装2.1)以"ideaIU-2018.3.3.exe"为例3.2)启动IDEA软件 友情提醒 点击文章目录可以跳转 第一章、IDEA软件下载 IDEA 全称 IntelliJ IDEA。在智能代码助手、代码…

字节跳动春招研发部分编程题汇总

状压dp(不会) http://t.csdn.cn/W9Pi2 #include <iostream> #include<string.h> #include<math.h> using namespace std; char a[1005]; char c[1005]; int main() {int n;scanf("%d",&n);for(int i1;i<n;i){scanf("%s",a);int l…

Pytorch学习笔记(1)

目录 1. 张量&#xff08;Tensors&#xff09; 2. 自动求导&#xff08;Automatic Differentiation&#xff09; 3. 神经网络的构建和训练 送书活动 PyTorch是一个基于Python的开源机器学习库&#xff0c;广泛应用于深度学习和人工智能领域。它提供了丰富的工具和函数&…

什么是域服务(NETBASE第十一课)

域服务(NETBASE第十一课) web虚拟主机(一台服务器运行多个WEB站点) Web虚拟主机的实现方法&#xff1a; 1&#xff09;同IP不同端口&#xff08;基于端口的虚拟主机&#xff09; 2&#xff09;同端不同IP&#xff08;基于IP的虚拟主机&#xff09; 3&#xff09;同端口同I…