设计模式--工厂设计模式

什么是工厂模式?

工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下引入新的产品类,从而实现更好的扩展性和可维护性。

示例:创建不同类型的形状对象

让我们通过一个简单的示例来理解工厂模式。假设我们需要创建不同类型的形状对象,比如圆形(Circle)、矩形(Rectangle)和正方形(Square)。

第一步:定义形状接口

首先,我们定义一个形状接口(Shape),所有具体的形状类都实现这个接口。

public interface Shape {void draw();
}

 

第二步:创建具体的形状类

接下来,我们创建实现 Shape 接口的具体形状类,例如 CircleRectangleSquare

public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}
第三步:创建抽象工厂类

我们创建一个抽象工厂类(ShapeFactory),定义一个工厂方法 createShape,由子类实现具体的创建逻辑。

public abstract class ShapeFactory {public abstract Shape createShape();
}
第四步:创建具体工厂类

然后,我们为每种形状创建对应的工厂类,实现工厂方法 createShape

public class CircleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}public class SquareFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
第五步:使用工厂类创建形状对象

最后,我们在客户端代码中使用具体的工厂类来创建不同的形状对象。

public class Client {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape shape1 = circleFactory.createShape();shape1.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape shape2 = rectangleFactory.createShape();shape2.draw();ShapeFactory squareFactory = new SquareFactory();Shape shape3 = squareFactory.createShape();shape3.draw();}
}
工厂模式的优点
  1. 解耦:工厂模式将对象的创建和使用解耦,客户端代码不需要知道具体类名,只需与工厂类和接口/抽象类交互。
  2. 扩展性:添加新类型的产品类时,只需增加相应的具体工厂类,无需修改现有代码,符合开闭原则(Open/Closed Principle)。
  3. 灵活性:通过工厂方法的重载或重写,可以灵活地控制对象创建的过程。
工厂模式的缺点
  1. 类的数量增加:每增加一种产品类,都需要增加相应的具体工厂类,导致类的数量增加。
  2. 复杂性:相对于简单工厂模式,工厂模式的结构更复杂,需要额外定义工厂类。
总结

工厂模式通过定义创建对象的接口,将对象的实例化延迟到子类,从而实现了解耦和扩展性。尽管其结构相对复杂,但在需要灵活创建对象且可能频繁变更的场景中,工厂模式是一种非常有用的设计模式。希望通过这个示例,你能更好地理解和应用工厂模式,让你的代码更加优雅和高效。

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

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

相关文章

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

数据湖仓一体(五)安装spark

上传安装包到/opt/software目录并解压 [bigdatanode106 software]$ tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/services/ 重命名文件 [bigdatanode106 services]$ mv spark-3.3.1-bin-hadoop3 spark-3.3.1 配置环境变量 [bigdatanode106 ~]$ sudo vim /etc/profile…

最优化(10):牛顿类、拟牛顿类算法

4.4 牛顿类算法——介绍了经典牛顿法及其收敛性,并介绍了修正牛顿法和非精确牛顿法; 4.5 拟牛顿类算法——引入割线方程,介绍拟牛顿算法以及拟牛顿矩阵更新方式,然后给出了拟牛顿法的全局收敛性,最后介绍了有限内存BFG…

Java中创建线程的方式

文章目录 创建线程ThreadRunnableCallable线程池创建方式自定义线程池线程池工作原理阻塞队列线程池参数合理配置线程池参数 创建线程 在Java中创建一个线程,有且仅有一种方式,创建一个Thread类实例,并调用它的start方法。 Thread 最经典也…

在Linux上设置MySQL允许远程连接的完整指南

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

构建图像金字塔遍历不同的大小

1、首先、构建金字塔,其中包括从原始图像到多层缩小后的图像。 import cv2# 读取原始图像 image cv2.imread(path_to_image)# 构建高斯金字塔 gaussian_pyramid [image] for i in range(6): # 这里假设构建6层image cv2.pyrDown(image) # 下采样gaussian_p…

【Linux】多线程_6

文章目录 九、多线程7. 生产者消费者模型生产者消费者模型的简单代码结果演示 未完待续 九、多线程 7. 生产者消费者模型 生产者消费者模型的简单代码 Makefile: cp:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f cpThread.hpp: #i…

vue引入sm-crypto通过sm4对文件进行加解密,用户输入密码

对文件加密并保存: import { sm4 } from sm-cryptofetch("你的文件地址") .then(response > response.blob()) .then(byteStream > {const reader2 new FileReader();reader2.onload function(event) {const arrayBuffer event.target.result;l…

【Linux】Linux必备的基础指令

目录 Linux必备的基础指令一 、 什么是Linux二、 Linux常用命令2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm 三、 Linux重要指令3.1 cp3.2 mv3.3 tail3.4 vim3.5 grep3.6 ps3.7 netstat Linux必备的基础指令 一 、 什么是Linux 系统编程&⽹络编程 Linux⾃⾝提供…

快速掌握块级盒子垂直水平居中的几种方式

大家好!今天我们来聊聊Web开发中如何实现块级盒子水平居中。在前端开发中,经常需要将一个块级盒子在父元素中进行垂直和水平居中对齐,本文将介绍几种常见且高效的实现方法。 一、子元素有固定宽高 第一种情况 子元素有固定宽高(…

面向对象设计(OOD)实践:探索组合、聚合和关联

面向对象设计(OOD)不仅是一种编程范式,更是一种思考问题和设计解决方案的方式。在OOD中,关系是对象之间交互的核心。本文将通过具体例子,深入探讨组合(Composition)、聚合(Aggregati…

编译x-Wrt 全过程

参考自;​​​​​​c编译教程 | All about X-Wrt 需要详细了解的小伙伴还请参看原文 ^-^ 概念: x-wrt(基于openwrt深度定制的发行版本) 编译系统: ubuntu22.04 注意: 特别注意的是,整个编译过程,都是用 …

java异常体系(清晰解释)

java异常体系分为错误和异常。 (1)错误就是error,是程序解决不了的,例如OOM内存溢出,JVM运行时数据区:方法区、堆、虚拟机栈、本地方法栈、程序计数器中只有程序计数器不会OOM。 (2&#xff0…

linux 查看 io使用率iotop

$ sudo apt install iotop iotop iotop 命令-CSDN博客

JAVA-----String类补充

一、常用方法 1、常见String类的获取功能 length:获取字符串长度; charAt(int index):获取指定索引位置的字符; indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引; substring(int start)&…

汽车的驱动力,是驱动汽车行驶的力吗?

一、地面对驱动轮的反作用力? 汽车发动机产生的转矩,经传动系传至驱动轮上。此时作用于驱动轮上的转矩Tt产生一个对地面的圆周力F0,地面对驱动轮的反作用力Ft(方向与F0相反)即是驱动汽车的外力,此外力称为汽车的驱动力。 即汽车…

求的一个最长的子字符串的长度,该子字符串中每个字符出现的次数都最少为 k(Java使用递归)

题目描述: 求的一个最长的子字符串的长度,该子字符串中每个字符出现的次数都最少为 k。 示例 : 示例 1: 输入:s "aaabb", k 3 输出:3 解释:最长子串为 "aaa" &#xff0c…

SunnyUI中uiSplitContainer的使用

在SunnyUI控件库中,UISplitContainer 是一个类似于Windows Forms中 SplitContainer 控件的组件,它允许你在一个容器内分割两个面板,通常一个作为主面板,另一个作为辅助面板。UISplitContainer 提供了更现代和美观的样式&#xff0…

知识图谱研究综述笔记

推荐导读:知识图谱Knowledge Graph Embeddings 论文标题:A Survey on Knowledge Graphs:Representation, Acquisition and Applications发表期刊:IEEE TRANSACTIONS ON NEURAL NETWORKS AND LEARNING SYSTEMS, 2021本文作者:Shaoxiong Ji, Shirui Pan, M…

Swiper轮播图实现

如上图,列表左右滚动轮播,用户鼠标移动到轮播区域,动画停止,鼠标移开轮播继续。 此例子实现技术框架是用的ReactCSS。 主要用的是css的transform和transition来实现左右切换动画效果。 React代码: import React, { us…