当前位置: 首页 > news >正文

常用设计模式...

创建型模式:涉及对象实例化,用于创建对象的模式,可以增加程序的灵活性和可重用性。常见的创建型模式有工厂方法、抽象工厂、单例、建造者、原型等。

结构型模式:涉及类和对象的组合,用于设计类和对象的结构,以便更好地实现程序的功能。常见的结构型模式有适配器、桥接、组合、装饰、外观、享元、代理等。

行为型模式:关注对象之间的通信,包括责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者等。

六大原则:

1、单一职责原则

        一个类只承担一个职责

2、开放封闭原则

        对软件实体的改动,最好用扩展而非修改的方式。

3、里式替换原则

父类可被子类替换,但反之不一定成立。也就是说,代码中可以将父类全部替换为子类,程序不会出现异常,但反过来就不一定了。

4、最少知识原则

理解:尽量减少对象之间的交互,从而减小类之间的耦合。在做系统设计时,不要让一个类依赖于太多其他的类,需尽量减小依赖关系,否则死都不知道怎么死的。

总结:一定要做到:低耦合、高内聚。

5、接口隔离原则

理解:不要对外暴露没有实际意义的接口。也就是说,尽量保证接口的实用性。当需要对外暴露接口时,需要再三斟酌,若没必要对外提供就删了吧,因为一旦提供了就意味着,将来要多做一件事情,何苦给自己找事做呢。

总结:不要对外暴露没有实际意义的接口。

6、依赖倒置原则

理解:高层模块不应该依赖于底层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。应该面向接口编程,不该面向实现类编程。面向实现类编程相当于就事论事,那是正向依赖;面向接口编程,相当于透过现象看本质,抓住事务的共性,那就是反向依赖,即依赖倒置。

单例模式

1.实现单例模式的关键点?

私有构造器;私有静态实例变量;公有静态方法

2.常见的单例模式实现?

        1、饿汉式如何实现单例?

饿汉式单例(Eager Initialization)在类加载时就急切地创建实例,不管你后续用不用得到,这也是饿汉式的来源,简单但不支持延迟加载实例。

        2、懒汉式如何实现单例?

懒汉式单例(Lazy Initialization)在实际使用时才创建实例,“确实懒”(😂)。这种实现方式需要考虑线程安全问题,因此一般会带上 synchronized 关键字。

3.单例模式的好处有哪些?

        单例模式能确保一个类仅有一个实例,并提供一个全局访问点来访问这个实例。

        这对于需要控制资源使用或需要共享资源的情况非常有用,比如数据库连接池,通过单例模式,可以避免对资源的重复创建和销毁,从而提高资源利用率和系统性能。

工厂模式

工厂模式属于创建型设计模式,主要用于创建对象,而不暴露创建对象的逻辑给客户端。其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。所有产品必须使用同一接口

1.工厂模式的主要类型

①、简单工厂模式(Simple Factory):它引入了创建者的概念,将实例化的代码从应用程序的业务逻辑中分离出来。简单工厂模式包括一个工厂类,它提供一个方法用于创建对象。想要增加产品就需要对工厂类进行修改,这样违反了开闭原则。

②、工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类进行。 每个品牌都有自己独立的工厂。

责任链模式

1、什么是责任链模式?

责任链模式是一种行为设计模式,它使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。

请求会沿着一条链传递,直到有一个对象处理它为止。这种模式常用于处理不同类型的请求以及在不确定具体接收者的情况下将请求传递给多个对象中的一个。


2.责任链模式主要包括以下几个角色:

        Handler(抽象处理者):定义了一个处理请求的接口或抽象类,其中通常会包含一个指向链中下一个处理者的引用。
        ConcreteHandler(具体处理者):实现抽象处理者的处理方法,如果它能处理请求,则处理;否则将请求转发给链中的下一个处理者。
        Client(客户端):创建处理链,并向链的第一个处理者对象提交请求。


3.工作流程

客户端将请求发送给链上的第一个处理者对象。
处理者接收到请求后,决定自己是否有能力进行处理。
如果可以处理,就处理请求。
如果不能处理,就将请求转发给链上的下一个处理者。
过程重复,直到链上的某个处理者能处理该请求或者链上没有更多的处理者。


4.责任链模式适用于以下场景:

有多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在不明确指定接收者的情况下,向多个对象中的一个提交请求。
需要动态组织和管理处理者时。

5.优缺点

优点:

降低耦合度:它将请求的发送者和接收者解耦。
增加了给对象指派职责的灵活性:可以在运行时动态改变链中的成员或调整它们的次序。
可以方便地增加新的处理类,在不影响现有代码的情况下扩展功能。
缺点:

请求可能不会被处理:如果没有任何处理者处理请求,它可能会达到链的末端并被丢弃。
性能问题:一个请求可能会在链上进行较长的遍历,影响性能。
调试困难:特别是在链较长时,调试可能会比较麻烦


http://www.mrgr.cn/news/59176.html

相关文章:

  • 在浏览器里就可以运行的本地AI模型 - 一键去除图片背景AI
  • 【力扣 + 牛客 | SQL题 | 每日三题】大厂笔试真题W1,W4
  • vue3 树型视图,利用自定义SFC来定义一个TreeItem,然后进行渲染出一个树形。
  • 英语语法学习框架(考研)
  • springboot医疗物品采购系统-计算机设计毕业源码10210
  • 在aws loadbalancer中配置http协议版本
  • 【Vulnhub靶场】DC-4
  • 2024高等代数【南昌大学】
  • 用kali入侵 DarkHole_2测试
  • 小白直接冲!一区蛇群优化算法+双向深度学习+注意力机制!SO-BiTCN-BiGRU-Attention多输入单输出回归预测
  • 安全见闻-web安全
  • 【Vue 3】全面解析Composition API的实战技巧
  • Python 从入门到实战40(数据分析概述)
  • C# async-await循环依赖梳理
  • 第四期书生大模型实战营(【入门岛】- 第2关 | Python 基础知识 )
  • 【Linux】SQLite 数据库安装教程(Ubuntu 22.04)
  • Linux之web服务器
  • 快捷键记忆
  • 变频器启动、停止、正/反转控制电路原理详解
  • Leecode热题100-287.寻找重复数
  • 实测体验Claude 3.5升级版:AI首次实现直接操控电脑!
  • Pyside6 布局管理器(3)--- QGridLayout的使用
  • Python使用unrar遇到的问题及解决
  • API网关的作用--为什么微服务需要一个API网关?
  • 计算机网络中网络层发送报文时IP地址的变化,交换器的广播功能及相关设备功能
  • 【Nas】X-DOC:Mac mini Docker部署中国特供版Jellyfin