自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (1)
  • 收藏
  • 关注

原创 xxxxx

xxxxx。

2023-09-12 20:08:05 167

原创 手写Sping(3) :手写AOP与事务管理

为了方便理解代码中的实现,我们先对AOP与事务的概念做简单介绍:AOPAOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或者责任(例如事务处理、日志管理、权限控制)封装起来,以便减少系统的重复代码,降低模块的耦合度,并有利于未来的可扩展性与可维护性。横切关注点:跨越应用程序多个模块的方法或者功能。即:与我们的业务逻辑无关,但是是我们需要关注的部分,也即横切关注点切面(Apect):横切关注点被模块化的特殊对象。即,它

2021-05-18 10:27:00 339

原创 手写Sping(2) :手写IOP与DI(依赖注入)

为了方便理解项目中的实现,我们先对IOC与DI进行简单的介绍控制反转IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。所谓IOC一句话搞定:对象由Spring来创建、管理、装配。而DI(依赖注入)是实现IOC的一种方式。所谓的控制反转就是获取依赖对象的方式反转了。Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 IO

2021-05-17 22:47:11 396 2

原创 手写Sping(1) : 项目介绍

为了进一步加深对Spring框架的理解,项目从Spring的IOC、依赖注入、AOP以及事务管理四个方面,对Spring框架进行简单的重写

2021-05-17 22:07:35 204

原创 JWT加密解密算法

JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它将使用数字签名(密钥)记性加密解密。什么时候使用JWTAuthorization (授权) : 这是JWT最常见的使用场景,一旦用户登录后,后面每个请求都将包含JWT,用户将被允许访问该令牌允许的路由、服务和资源。单点登录是JWT应用的一个场景,并且JWT可以轻松的跨域使用。Information Exchange (

2021-04-30 23:23:13 7364 1

原创 Redis集群工作原理

Redis Clusterredis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求。Redis自动将数据进行分片,每个master上放一部分数据提供内置的高可用支持,部分master不可用时,还是可以继续工作的,但是当超过一半的master结点挂掉后,集群将不再可用。支撑N(N必须是奇数)个redis master node,每个master node都可以挂载多个slave node高可用,因为每个master都有salve节点,那

2021-04-12 21:26:34 262

原创 redis集群:RedisCluster 出现redis.clients.jedis.exceptions.JedisConnectionException: no reachable node in

错误信息Exception in thread "main" redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:57) at redis

2021-04-10 15:47:29 563

原创 String与byte[]的互转

在Java中可以实现序列化将Java对象转为二进制序列,这方便进行对象数据的传输与存储。在实际使用的过程中,将二进制序列转为String是一种常见的形式。下面我们先介绍一种错误的互转方式,这也是我搜索时见过最多的。public class SerializeUtils { public static byte[] serialize(Object obj){ byte[] bytes = null; try { ByteArrayOutpu

2021-04-10 12:54:05 279

原创 刷题笔记:再讲二分查找(以leetcode剑指offer53-I为例)

在这篇博客中,我们以leetcode162题为例对二分查找中的易错点进行了辨析,但是在这篇博客中,关于左右边界的查找写的并不好。下面对左右边界的查找的代码进行简化。左边界查找在上篇博客中,这块关于左边界查找的通用模板是以[0,nums.length)为范围进行查找的。这篇博客中关于查找范围的讲解时非常棒的。下面对于其中模板的改进也是基于这个理论的: int len=nums.length; int mid=0; int left=0,right=len-1

2021-03-27 16:52:03 105

原创 Redis入门:redis持久化

Redis将数据存储在内存当中,为了防止数据丢失与服务重启时能够恢复数据,Redis支持数据的持久化,这主要分为两种方式,即RDB与AOF.RDBRDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。生成的rdb文件的名称以及存储位置由redis.conf中的dbfilename和dir两个参数控制,默认生成的rdb文件是dump.rdb。触发方式手动触发在redis客户端执行save与bgsave命令。但两种命令存在区别:sa

2021-02-08 17:56:43 91

原创 刷题笔记:快慢指针

快慢指针相关证明Th 1.在有环的链表中,快慢指针一定相遇。证明:如果链表中有环,快慢指针一定在环内相遇。这可以看做是,快指针追赶慢指针的过程。如果快指针在与慢指针差一步,则在下一步中,快指针前进两步,慢指针前进一步,两个指针相遇。如果快慢指针相差两步,在下一步中,快指针前进两步,慢指针前进一步,两个指针相差一步,转为第一种情况。如果快慢指针相差N步,经过N-1步的追逐,转换为第一种情况。因此在有环的链表中快慢指针必然相遇。2.Th 2:慢指针进入环之后,快指针最多比慢指针多绕一个圈。证

2021-01-27 12:10:15 163

原创 check the manual that corresponds to your MySQL server version for the right syntax to use near ‘XX‘

问题描述:我的项目原来是使用Orcale的,为了方便使用我想把它改为mysql的。在完成重新建表进行测试时,出现这个令人匪夷所思的bug——check the manual that corresponds to your MySQL server version for the right syntax to use near ‘where id=‘1’’,还说是语法错误。原因分析:在查看出错的sql语句后,我很确信语法不会有问题。这能怎么错???参考了这篇博文,我觉得问题应该在关键字上。解决

2021-01-18 18:02:17 178

原创 刷题笔记:排序算法总结(计数、桶排、基数)

计数排序计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。算法步骤:找出待排序的数组中最大和最小的元素;统计数组中每个值为i的元素出现的次数,存入数组C的第i项;对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。代码如下:下述代码事实上还可以进行优化,即新建的tmp的大

2021-01-07 12:08:27 107

原创 刷题笔记:排序算法汇总(2)(选择、归并)

归并排序(二路归并)思想:利用分治的思想,对待排序的数组划分为一个个的子排序任务,然后合并,再进行排序。具体来说就是:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。将上述步骤递归进行,直至最终得到有序序列。见下图:代码实现如下: public static int[] sort(int[] nums){ return reSort(nums,0,nums.length-1); }

2021-01-06 19:47:13 77

原创 刷题笔记:排序算法汇总(1)(冒泡、快排、插入排序、希尔排序)

排序算法是算法题中非常常见的一类题,相关的排序方法也很多,如:快速排序、冒泡排序、归并排序、简单选择排序、堆排序等等。本文以Leetcode 面试题 17.14. 最小K个数为例,对以上排序算法做一个回顾。冒泡排序冒泡排序是一种交换排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法步骤:比较相邻的元素。如果第一个

2020-12-27 14:13:59 116

原创 刷题笔记:根据中序遍历与前序遍历确定二叉树&根据后序遍历与前序遍历确定二叉树

根据中序遍历与前序遍历确定二叉树对于一棵树而言,前序遍历的形式为:[根节点,[左子树的前序遍历],[右子树的前序遍历]]。中序遍历形式为:[[左子树的中序遍历],根节点,[右子树的中序遍历]]因此,只要我们定位到根节点在中序遍历中的位置,就可以知道其左边的序列是其左子树的中序遍历,右边的序列是其右子树中序遍历的结果。此外,由于中序与前序遍历,其子树节点的数量是一定的,所以可以进一步确定根节点的左子树与右子树的前序与中序遍历。因此,我们就可以递归的构造左子树与右子树。代码实现如下:public

2020-11-20 22:57:20 518

原创 谷歌学术403:某URL没有权限访问

出现这个问题的原因,可能是因为电脑不间断的发送访问谷歌学术的请求,导致IP被封,放着不管,过段时间自己也会好,但有的时候着急用不能等,这个时候该怎么解决呢?解决方法在谷歌浏览器中找到设置,然后点击隐私设置与安全性——>清除浏览数据然后选择请清楚cookie及其他缓存文件。再次打开谷歌学术,已经可以正常访问,问题解决。...

2020-11-20 09:36:18 19585 4

原创 Java:深度优先搜索、广度优先搜索

以下图的遍历为例广度优先搜索英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。在实际实现中,使用队列来进行实现,先往队列中插入左节点再插入右节点,这样出队就是先左后右了。先将A插入队列中,队列中有元素(A)将A弹出,得到A结点,然后A的孩子从左至右先后放到队列中,(B,C)。继续弹出B,得到B结点,然后将B的孩子从左至右先后放入到队列中,(C,D,E)。然后弹出C,将C的左右孩子依次放入(D,E,F

2020-11-14 18:31:30 96

原创 深度学习实验:服务器上批量nohup运行程序

在运行python程序时,需要对多个版本或者多个方法的代码进行运行,它们往往需要设置一个系列的参数,然后使用python xxx.py运行该py文件。这种情况往往要做大量重复的没有意义的工作,所以我想通过批量生成运行命令,然后批量跑实验。解决方案:首先我们需要一个批量生成命令的脚本,如下:from copy import deepcopydef generate(param_dict): count=0 final=1 for k,v in param_dict.ite

2020-11-03 16:05:20 1788

原创 刷题笔记:树的前序、中序、后序遍历

在此之前,我们定义二叉树的数据结构如下:class TreeNode//节点结构{ int value; List<TreeNode> children=new ArrayList<>(); TreeNode left; TreeNode right; TreeNode(int value) { this.value = value; }}//主函数public class main { public static List<In

2020-10-31 17:17:13 258

原创 Java设计模式——行为型模式:职责链模式(责任链模式)

在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度模式定义为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。在责任链模式中,客户

2020-10-20 09:36:43 113

原创 Java设计模式——行为型模式:模板方法模式

例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。模式定义定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。模式结构模板方法模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调

2020-10-18 23:08:01 866

原创 Java设计模式——创建型模式:原型模式(克隆模式)

模式定义原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。模式介绍动机:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。优点:1、性能提高。 2、逃避构造函数的约束。缺点: 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别

2020-10-18 22:39:36 110

原创 Java设计模式——结构型模式:组合模式

模式定义组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。动机: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。模式介绍主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户

2020-10-17 23:47:17 134

原创 Java设计模式——行为型模型:迭代器模式

模式定义迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。模式介绍主要解决:不同的方式来遍历整个整合对象。何时使用:遍历一个聚合对象。如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。关键代码:定义接口:hasNext, next。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码

2020-10-17 23:00:46 82

原创 Java设计模式——行为型模式:策略模式(政策模式)

模式动机完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,每一个封装算法的类我们都可以称之为策略(Strategy),为了保证这些策略的一致性,一般会用一个抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策

2020-10-15 23:06:21 122

原创 Java设计模式——行为型模式:状态模式

模式动机在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。模式定义允许一个对象在其内部状态状态改变时,改变它的行为,对象看起来似乎修改了它的类。模式结构状态模式包含如下角色:Context: 环境类State: 抽象状态类ConcreteState: 具体状态类时序图状态图如下:代码实现//抽象状态类public interface State {

2020-10-15 22:39:16 89

原创 Java设计模式—行为型模式:观察者模式

模式动机建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将作出相应反应。在此,发生改变的目标称为观察目标,被通知的对象称为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系。模式定义定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(D

2020-10-14 22:47:08 72

原创 Java设计模式——行为模式:中介者模式(调停者模式)

模式动机在面向对象的软件设计与开发中,根据“单一职责原则”,我们应尽量将对象细化,使其值负责或呈现单一职责。对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互引用,为了减少对象两两之间的复杂引用关系,使之成为一个松耦合系统,这就是中介者模式的模式动机。模式定义用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。模式结构中介者模式包含如下角色:Mediator

2020-10-14 09:30:49 124

原创 Java设计模式——行为模式:命令模式(动作模式或事务模式)

模式动机在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作时哪个,我们只需要在程序运行时指定具体的请求接受者即可,此时可以使用命令模式进行设计。命令模式可以去发送者和接受者完全解耦,发送者与接收者之间没有直接的引用关系,发送请求的对象只需要知道如何发送请求,不必知道如何完成请求。模式定义将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Acti

2020-10-13 22:40:07 295

原创 Java设计模式——结构型模式:代理模式

模式动机在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。模式定义给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。模式结构代理模式包含如下角色:Subject: 抽象主题角色Proxy: 代理主题角色RealSubj

2020-10-12 22:14:49 92

原创 Java设计模式——结构型模式:外观模式(门面模式)

模式动机模式定义外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。模式结构外观模式包含如下角色:Facade: 外观角色SubSystem:子系统角色时序图代码实现//子系统public class CPU { public void startup(){ System.out.println("cpu

2020-10-12 21:36:08 81

原创 Pytorch显存不断增长问题的解决思路

这个问题,我先后遇到过两次,每次都异常艰辛的解决了。在网上,关于这个问题,你可以找到各种看似不同的解决方案,但是都没能解决我的问题。所以只能自己摸索,在摸索的过程中,有了一个排查问题点的思路。下面举个例子说一下我的思路。大体思路其实思路很简单,就是在代码的运行阶段输出显存占用量,观察在哪一块存在显存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认问题点,也即如果存在三个文件main.py、train.py、model.py。在此种思路下,应该先在main.py中确定问题点,然后,从main

2020-10-12 19:31:53 5039 3

原创 Java设计模式——结构型模式:装饰模式(油漆工模式)

模式动机一般有两种方式可以给一个类或者对象增加行为:继承机制,常用不做解释关联机制,即将一个类的对象嵌入到另一个对象中,由另一个对象决定是否调用嵌入对象的行为来扩展自己的行为,我们称这个接入嵌入对象的类为装饰器。装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。模式定义动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式

2020-10-11 14:44:08 273

原创 Java设计模式——结构型模式:桥接模式(接口模式或柄体模式)

模式动机设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:第一种设计方案是为每一种形状都提供一套各种颜色的版本(4x3种版本)。第二种设计方案是根据实际需要对形状和颜色进行组合(4个形状版本加3个颜色版本)对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的

2020-10-10 22:31:53 155

原创 Java设计模式——结构型模式:适配器模式

模式动机通常情况下,客户端可以通过目标类的接口访问它所提供的服务,但是可能存在目标类满足客户功能,提供的接口不一定是客户端所需要的,这可能是由于现有类中的方法名与目标类中定义的方法名不一致等原因导致的。适配器模式可以提供一个包装类,包装不兼容的接口对象,这个包装类就是适配器,它所包装的对象就是适配者,即被适配的类。当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适

2020-10-10 21:35:03 178

原创 Java设计模式(五):单例模式(单件模式或单态模式)

模式动机对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但只能有一个正在工作的任务。保证一个类只有一个实例对象就是单例模式的动机。一个好的解决方法是,让类负责保存它唯一的实例,这个类可以保证没有其他实例被创建,并且可以提供一个访问该实例的方法。模式定义单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局的方法。单例模式的三大要点:某个类只能有一个实例这个类必须自行创建这个实例该类必须自行向整个系统提供这个实例

2020-10-10 12:45:45 165

原创 Java设计模式(四):建造者模式(生成器模式)

模式动机在现实生活中存在一些复杂的产品,如汽车,它有方向盘、轮胎、发动机灯组件构造而成,但是用户无需知道各个组件的生产过程与具体的构造过程,只需要最后得到一个汽车即可。在软件设计中,也有一些复杂的对象,它拥有一系列成员属性。复杂对象相当于一辆汽车,对象的属性则相当于汽车的部件,建造产品的过程相当于组合部件的过程。由于这个过程过于复杂,因此这些部件的组合过程往往被外部化到一个称为建造者的对象中,建造者将建造完毕的复杂对象返回给客户端。用户无需关心该对象所包含的属性以及他们的组装方式,这就是建造者模式的模式

2020-10-08 23:20:16 236

原创 Java设计模式(三):抽象工厂模式

模式动机在工厂方法模式中,具体工厂生产具体产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性。一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法,但是有时我们需要一个具体工厂方法提供多个产品对象,而不是单一的产品对象。为了更清晰地理解工厂方法模式,需要先引入两个概念:产品等级结构 :产品等级结构即产品的继承结构。例如抽象类电视机,其子类有海尔电视机、海信电视机,此时抽象类电视与具体类电视机构成一个产品等级结构。产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,属于不同产

2020-10-07 23:34:10 66

原创 Java设计模式(二):工厂方法模式

模式动机在上文中,我们了解到简单工厂模式的动机,优点与缺点。简单工厂模式中,工厂类担负的责任过重,如果要新增具体产品就必须对工厂类进行重新实现,没有满足开闭原则。在工厂方法中,创建了工厂的抽象类,当需要新增具体产品时,只需要针对相应的具体产品新增对应的工厂类即刻。模式定义工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中

2020-10-07 21:59:23 1218

英文电影中的西方文化答案.docx

英文电影中的西方文化 冯彦慕课答案

2020-04-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除