首页 > 其他分享 >学习记录:设计模式

学习记录:设计模式

时间:2024-09-13 22:24:09浏览次数:3  
标签:单例 记录 对象 代理 模式 工厂 学习 产品 设计模式

设计模式(Design Pattern):

        是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

设计模式的分类:

常见的GOF种设计模式:

        单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。

        工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。

         抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。

        代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。

        装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能

单例模式:

        Singleton 模式通常有两种实现形式。

        第 1 种:懒汉式单例 该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。代码如下:


        第 2 种:懒汉式单例 该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

简单工厂模式:

        工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”。

抽象工厂模式:

        抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。 使用抽象工厂模式一般要满足以下条件。系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。 系统一次只可能消费其中某一族产品,即同族的产品一起使用。 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。 当增加一个新的产品族时不需要修改原代码,满足开闭原则。 其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

代理设计模式:

        在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等 。

        代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

         代理模式的主要优点有:代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;

         其主要缺点是:在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢; 增加了系统的复杂度       

         静态代理  :

        代理类中包含了对真实主题的引用,这种方式存在两个缺点。真实主题与代理主题一一对应,增加真实主题也要增加代理。

动态代理:

        设计代理以前真实主题必须事先存在,不太灵活。采用动态代理模式可以解决以上问题,如 SpringAOP,不用真实主题和代理都实现真实主题的接口

代理newProxyInstance

有三个参数

1.真实对象的类加载器
2.真实对象的接口对象
3.处理代理对象方法调用的调用处理器

装饰模式:

        在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。

装饰模式的定义与特点:

        装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰(Decorator)模式的主要优点有:采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。

使用构造的方式来传递功能对象

这样就可以通过不改变源代码而在原有功能上进行增强

标签:单例,记录,对象,代理,模式,工厂,学习,产品,设计模式
From: https://blog.csdn.net/fragilezz/article/details/142217486

相关文章

  • 学习记录:MySQL索引
    索引的作用加速数据检索:通过为数据库表创建索引,可以极大地减少数据库引擎在查询过程中需要扫描的数据量,从而显著提升数据检索的速度。像是字典的目录,快速定位到所查找的内容。强化数据完整性:唯一索引(UniqueIndex)能够确保表中的某一列或列组合的值是唯一的,有效防止数据重复......
  • 图像检测【YOLOv5】——深度学习
    Anaconda的安装配置:(Anaconda是一个开源的Python发行版本,包括Conda、Python以及很多安装好的工具包,比如:numpy,pandas等,其中conda是一个开源包和环境管理器,可以在不同环境之间切换,是深度学习的必备平台。)一.Anaconda安装配置.1.首先进入官网:https://repo.anaconda.com,选择ViewAllIns......
  • 设计模式——工厂模式
    工厂模式1简单工厂模式1.1需求用例看一个披萨的项目:要便于披萨种类的扩展,要便于维护披萨的种类很多(比如GreekPizz、CheesePizz等)披萨的制作有prepare,bake,cut,box完成披萨店订购功能。1.2使用传统的方式来完成类图分析publicOrderPizza(){ Pizzapizza=......
  • ssm基于SSM的在线学习系统的设计与实现
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql免费提供给大家参考或者学习,获取源码请私聊我目录1系统概述 11.1研究背景 11.2研究目的 11.3系统设计思想 12相关技术 32.1MYSQL数据库 32.2B/S结构 32.3SSM框架简介 43系统分析 63.1可行......
  • Java学习全套视频教程网盘资源下载
    如大家所了解的,Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。Java之所以可以让计算机识别,是因为Java的编译器和Java虚拟机,它会将人按照一定规范写成的信息翻译成机器所能识别二进制的信息,这样就可以让我们很好的和计算机进......
  • 2024.9.13训练记录
    下午ARC104模拟短时赛:T1、T2:T1签到题。T2签到题,\(O(n^2)\)乱做。但是实际上可以空间换时间开桶到\(O(n)\)。也非常简单。T3:考场没有做出。思考的关键在于想到可以对于区间单独判断是否满足条件。知道了如何判断区间是否满足条件后,可以做一次\(O(n)\)的\(dp\)。每次枚......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.9.13)
    P545TreeMap源码解读     TreeSet的k-v其中的v是一个静态的对象,但是TreeMap的v是可以变化的     TreeMap使用默认构造器取出的顺序和添加的顺序是不一样的,但是有构造器实现了Comparator接口的匿名内部类,可以按顺序排序P546Collections工具类1P547Collect......
  • 深度学习:入门简介
    目录一、深度学习与机器学习的关系二、神经网络构造三、推导四、感知器与多层感知器1.感知器2.多层感知器3.偏置五、如何确定输入层和输出层个数一、深度学习与机器学习的关系        深度学习是一种机器学习的子领域,利用多层神经网络来学习数据的复杂特征......
  • opencv-python学习笔记9-图像分割
    目录一、图像分割的概述、技术现状、应用:技术现状:传统图像分割技术:深度学习驱动的图像分割技术:应用领域:二、 图像分割的方法和分类:(1)基于阈值的分割方法:(2)基于区域的分割方法:(3)基于边缘的分割方法:(4)基于特定理论的分割方法:(5)基于深度学习的分割方法:三、图像分割的原理:......
  • 如何学习go语言
    学习Go语言是一个系统而逐步深入的过程,以下是一些关键步骤和建议,帮助你高效地学习Go语言:书在python33点(0M一、了解Go语言的基础知识学习语法和基本概念:阅读官方的Go语言文档,包括语言规范、标准库和示例代码,了解Go语言的基本特性和用法。Go语言拥有简洁的语法结构和高效......