编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

谈谈我工作中的23个设计模式,秒懂Java设计模式,上集

gowuye 2024-04-03 16:15 12 浏览 0 评论

谈谈我工作中的23个设计模式

创作不易,关注、点赞,分享,转发,评论,收藏


叙述

从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是对抽象归纳的一个比较好的解决思路。在日常工作中,运用Java设计模式思路,可以更好地去思考理解这些设计模式。

抽象工厂(Abstract Factory):多套方案

抽象工厂就是围绕一个超级工厂创建其他工厂。这个超级工厂也被称为其他工厂的工厂。抽象工厂模式属于创造性模式,它提供了创建对象的最佳方式。在抽象工厂中,接口是负责创建相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都可以根据工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口方法,无需指定它们具体的类。

主要解决:解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

在工作中,我们应该具备提供多套设计方案的能力,提供多种选择性。需要有这样的前瞻意识,扩展自己的思维方式。

以下是抽象工厂概述图

生成器(Builder):善于分解

构建器,也称为构建器模式,使用几个简单的对象逐步构建一个复杂的对象。构建器模式属于创造性模式,它提供了创建对象的最佳方式。

介绍

意图:将一个复杂的构建与其具体实现相分离,使得同样的构建过程可以创建不同的表现形式。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:创建和提供实例,管理建造出来的实例的依赖关系。

工厂方法(Factory Method):抽象思考

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

总的来说,在工厂模式中,我们创建对象的过程中,不会对客户端暴露创建逻辑,通过使用共同的接口,来指向新创建的对象。

工厂方法模式是将提供某一产品的过程进行抽象,通过接口的模式去规范出来。如果我们转换思维,处理问题的思维逻辑,终究是发现事物的本质:

  1. 到底在做什么
  2. 我们的职责是什么
  3. 提供什么样的价值。

原型(Prototype):传承知识

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这原型模式属于创建型模式,它提供了一种创建对象的最佳方式。

原型模式是实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式是说,利用拷贝对象的方法,减少一些复杂的创建过程。

单件(Singleton):专注

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式属于创建型模式,提供了一种创建对象的方式。单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

介绍

意图:一个类仅有一个实例,具备全局访问点。

主要解决:全局使用的类频繁进行创建与销毁。

何时使用:当节省系统资源。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的

单件模式是说在多线程的情况下,要保证对象只创建一遍,作为独一无二的资源。

单例模式的几种实现方式

单例模式的实现有多种方式,如下所示:

1、懒汉式,线程不安全

是否 Lazy 初始化:

是否多线程安全:

实现难度:

2、懒汉式,线程安全

是否 Lazy 初始化:

是否多线程安全:

实现难度:

3、饿汉式

是否 Lazy 初始化:

是否多线程安全:

实现难度:

4、双检锁/双重校验锁(DCL,即 double-checked locking)

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多线程安全:

实现难度:较复杂

5、登记式/静态内部类

是否 Lazy 初始化:

是否多线程安全:

实现难度:一般

6、枚举

JDK 版本:JDK1.5 起

是否 Lazy 初始化:

是否多线程安全:

实现难度:

适配器(Adapter):适应能力

适配器模式(Adapter Pattern)作为两个不兼容的接口之间的桥梁。适配器模式属于结构型模式。适配层往往不是提前的设计,而是基于现有现有的系统进行的妥协和适配。

结构图

介绍

意图:将一个类的接口转换成客户希望的另外一个接口。

主要解决:解决在软件系统中,将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的应用场景。

何时使用:

1、系统需要使用现有的类,而此类的接口不符合系统的需要。

2、通过接口转换,将一个类插入另一个类系中。

如何解决:继承或依赖。

关键代码:适配器继承或依赖已有的对象,实现想要的接口。

总的来说,适配器是为了结合原来的能力,适配新的接口服务,比如适配不同的协议入口。

桥接(Bridge):合理关系

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。桥接设计模式属于结构型模式.

结构图

介绍

意图:将抽象与实现分离,都可以独立的变化。

主要解决:在有多种可变的情况下,用继承会造成类扩展性不高,运用起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

桥接模式是将原来相互依赖的部分,通过上层接口再往抽象层提一下,减少类之间的直接合作,形成间接关系。

组合(Composite):递归思考

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。

结构图

介绍

意图:使用户对单个对象和组合对象的使用具有一致性。

主要解决:客户程序可以处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用:

1、对象的部分-整体层次结构(树形结构)。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

组合模式通过继承和孩子节点,可以递归地去描述一个对象层次。

相关推荐

爱上开源之golang入门至实战第四章-切片(Slice)

前言Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可...

Go语言入门必知教程-切片

切片是一种灵活的和可扩展的数据结构,用于实现和管理数据集。切片由多个元素组成,所有元素都是相同类型的。切片是动态数组的一部分,可以根据需要进行增长和收缩。与数组一样,切片也可以索引。切片具有容量和长度...

Go语言基础-切片

切片是什么?切片是Go语言的一种数据结构。和数组相似,不过切片可以在它的结尾增加更多的元素。这样可变长度在实际编程中更为有用。声明切片切片的声明和数组也很相似,只是声明切片时不需要指定大小。例:va...

5分钟掌握GO中切片的基本使用方法

最近Golang越来越火,不少小伙伴都纷纷开始学习Golang,但对于原先为C++或者JAVA的同学,用习惯了数据、list、vector等,会对Go的切片slice不习惯,下面整理出go中slice...

揭秘 Go 切片(Slice)的秘密

当向切片添加新参数时,底层数组会发生什么变化?它会扩展以容纳更多元素吗?在这篇文章中,我们将深入探讨切片的内部工作原理,以及如何利用这些知识来进行更好的内存管理和性能优化。具体而言,我们将探索Go...

【Go语言slice详解】深入掌握Go语言中的slice类型及常用操作!

Go语言中的slice(切片)是一种非常方便的数据结构,可以动态地增加或减少其元素数量,且可以访问底层数组的任意一个子序列。本文将对Go语言中的slice进行详细的讲解。Slice的定义在Go语言中,...

掌握GO中的Slice,这就够了

最近Golang越来越火,不少小伙伴都纷纷开始学习Golang,但对于原先为C++或者JAVA的同学,用习惯了数据、list、vector等,会对Go的切片slice不习惯,下面整理出go中slice...

golang2021面向对象(26)Go语言类型内嵌和结构体内嵌

结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。?可以粗略地将这个...

2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内

2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"],"S...

Go语言文件和目录操作

文件和目录操作概述一、文件和目录操作概述在计算机中,文件和目录是存储数据的重要方式。在Go语言中,我们可以使用os和io/ioutil包提供的函数和结构体来进行文件和目录操作。本文将详细介绍Go语言中...

跟我一起学习go语言(五)golang中结构体的初始化方法

1、自定义一个结构体typeVertexstruct{X,Yfloat64}2、初始化方法-指针:rect1:=new(Vertex)rect2:=&Vertex...

Go复合数据类型:结构体

一种通用的、对实体对象进行聚合抽象的能力,在Go中,提供这种聚合抽象能力的类型是结构体类型,也就是struct。自定义一个新类型在Go中,我们自定义一个新类型一般有两种方法。第一种是类型定义...

Go语言基础:方法

导读在阅读本文章前,假定你具备如下能力:?已掌握结构体1.方法1.1方法的概念在理解程序中方法的概念时,我们先看看现实中的一些情况,这样相对比较好理解一些。在农村的朋友可能会知道,在医疗落后的情况...

为什么 Go 语言 struct 要使用 tags

在Go语言中,struct是一种常见的数据类型,它可以用来表示复杂的数据结构。在struct中,我们可以定义多个字段,每个字段可以有不同的类型和名称。除了这些基本信息之外,Go还提供了s...

一文带你掌握掌握 Golang结构体与方法

1.Golang结构体的概念及定义结构体是Golang中一种复合类型,它是由一组具有相同或不同类型的数据字段组成的数据结构。结构体是一种用户自定义类型,它可以被用来封装多个字段,从而实现数据的...

取消回复欢迎 发表评论: