java常用设计模式详解,java设计模式详解
这个总结主要是基于我之前关于基本设计模式的系列文章。我主要是用自己的话解释了重要的知识点,可能会有一些错误。请见谅,给点建议。
如何解决写爬虫IP受阻的问题?立即使用。
设计模式
创建型模式
创建模式的作用是创建对象。说到创建对象,大家最熟悉的就是创建一个对象,然后设置相关属性。然而,在许多场景中,我们需要为客户端提供一种更友好的方式来创建对象,尤其是当我们定义了类,但需要将它们提供给其他开发人员时。
单例
确保singleton模式下全局singleton类只有一个实例,这样在使用时就可以直接得到。例如,Spring中数据库和bean的连接都可以是单例的。
一般来说,有五种方法可以编写单例模式。
第一种是Hungry-Chinese模式,先实例化单个实例,直接用静态方法获取即可。缺点是类的实例化是在类加载后完成的,浪费了一些空间。
第二种是中文饱和模式,先将singleton设置为null,然后在静态方法获取singleton时实例化。但是可能会有多个线程同时实例化,会导致并发问题。
第三种方法是逐步改进。一开始可以用synchronized关键字进行同步,但是成本太高。然后,改为使用volatile来修饰singleton。然后,检查一次以确定单例是否已经初始化。如果它还没有被初始化,那么使用同步代码块,然后在它被真正初始化之前,再次检查单例,以防止它在此期间被初始化。
第四种是使用静态内部类,只有在使用的时候才会初始化。因此,内部类中的单例实例化只会在使用它们时运行实例化代码。然后外部类通过静态方法返回静态内部类的单个实例。
第五个是枚举类,枚举类的底层实现其实是一个内部类。枚举确保每个类对象都是全局唯一的。所以这种方法是最简单的保证是单一情况。工厂模式
简单工厂通常使用一个工厂来创建类的多个实例。
工厂模式(Factory pattern)一般是指服务于一个接口并实例化这个接口的实现类的工厂。
抽象工厂是指一个工厂服务于一个产品族,一个产品族可能包含多个接口,而接口又包含多个实现类。通过一个工厂把这些绑定在一起是非常方便的。原型模式
一般来说,克隆一个实例是为了获得同一个原型的更多实例。使用实例的clone方法。建造者模式
构建器模式中有一个概念叫做链调用,它有助于类的实例化。通常,提供一系列方法用于实例化。实际上是对set方法进行了变换,将原来返回为空的set方法改为返回这个实例,从而实现了链式调用。
在此基础上,builder模式增加了builder方法,提供给外部调用,也使用链式调用完成参数注入。结构型模式
前面的creative模式介绍了一些创建对象的设计模式,本节介绍的structural模式旨在通过改变代码结构来实现解耦,使我们的代码易于维护和扩展。
适配器模式
适配器模式用于适配两个不同的类。
适配器模式和代理模式的异同
比较这两种模式,其实就是比较对象适配器模式和代理模式。就代码结构而言,
它们非常相似,都需要一个实现类的具体实例。
然而,它们的目的是不同的。代理模式是为了增强原始方法的活性。
适配器适配提供“把鸡包装成鸭,然后当鸭用”。
鸡鸭之间没有遗传关系。
适配器模式可以分为类适配器、对象适配器等。
适配器可以通过继承父类使自己适应父类。
对象适配器需要将对象传递到另一个对象的构造方法中进行打包。
享元模式
/远翔模式的核心在于远翔工厂类,
//共享工厂类的作用是为存储共享对象提供一个共享池,
//当用户需要一个对象时,首先从共享池中获取,
//如果在享受池中不存在,创建一个新的享受对象返回给用户,
//将新添加的对象保存在共享池中。
//分享元模式
//英文是Flyweight模式。不知道这个词是谁最先翻译的,感觉这个翻译真的很难懂。让我们试着建立一个关联。Flyweight的意思是轻量级,也就是分开共享组件,也就是复用生成的对象,当然是轻量级的。
//重用对象的最简单方法是使用HashMap来存储每个新生成的对象。每次需要一个对象的时候,就去HashMap看看有没有。如果没有,生成一个新对象,然后把它放入HashMap。
//这个简单的代码我就不演示了。
代理模式
//我们发现没有,说白了,代理模式就是做“方法打包”或者“方法增强”。
//在面向方面编程中,还是不要吹捧这个术语了。在AOP中,
//其实就是动态代理的过程。例如,在春天,
//我们自己不定义代理类,但是Spring会帮我们动态定义代理,
//然后将我们在@Before、@After、@Around中定义的代码逻辑动态添加到代理中。
外观模式
模式通常封装了具体的实现细节,为用户提供了更简单的界面。
您可以通过方法调用获得所需的内容。
组合模式
//复合模式用来表示具有层次结构的数据,这样我们对单个对象和复合对象的访问是一致的。
//直接看个例子。每个员工都有姓名、部门、薪资等属性。
//还有一个下属员工的集合(虽然集合可能是空的),
//和下属员工的结构和自己一样,
//还有姓名、部门等属性,
//还有他们下属员工的集合。
员工类别{
私有字符串名称;
私弦部;
私人int薪金;
私人列表员工下属;//下属
}装饰者模式
装饰者
装饰模式从每个增强类继承最高级别的父类。然后,当需要功能增强时,可以将类实例传入增强类,然后增强类在使用时可以增强原类的功能。
与代理模式不同,decorator模式中的每个装饰类都继承了父类,并且可以封装在多个级别中。
行为型模式
行为模式侧重于各个类之间的交互,明确划分职责,让我们的代码更加清晰。
策略模式
一般一个策略模式以一个策略为一个类,当需要指定一个策略时,就传入实例,这样我们就可以在需要使用算法的地方传入指定的算法。
命令模式
命令模式一般分为三个角色:命令发起者、命令者和命令接收者。
命令的发起者在使用时需要注入命令实例。然后执行命令调用。
调用命令实际上是调用命令接收方的方法来进行实际调用。
比如遥控器按钮就相当于一个命令。点击按钮,命令运行,可以自动调用电视提供的方法。
模板方法模式
一般方法模板是指提供一个方法模板,其中有一些实现类和一些抽象类,并指定执行顺序。
类的实现是模板提供的一个好方法。抽象类需要用户自己实现。
模板方法指定了一个模板中方法的执行顺序,非常适合一些开发框架,所以模板方法在开源框架中也被广泛使用。
观察者模式和事件监听机制
观察者模式通常用于订阅者和消息发布者之间的数据订阅。
一般分为观察者和话题。观察者订阅主题,并在主题维护的观察者列表上注册实例。
当主题更新数据时,它会自动将数据推送给观察者,或者通知观察者数据已经更新。
但是,这样一来,消息推送耦合关系就比较紧密了。而且不打开数据很难知道数据类型是什么。
后来,为了使数据格式更加灵活,使用了事件和事件监听器的模式,事件包装的事件类型和事件数据与主题和观察者解耦。
当一个主题事件发生时,触发该事件的所有监听器,并通过监听器列表将事件发送给每个监听器。监听事件后,首先根据自己支持的事件类型找到相应的事件处理程序,然后使用处理程序处理相应的事件。
责任链模式
责任链通常需要先建立一个单向链表,然后调用方只需要调用头节点,后面会自动流转下去。比如流程审批就是一个很好的例子。最终用户只要提交一个申请,就会根据申请的内容信息自动建立一个责任链,然后流程就可以开始了。以上是Java设计模式介绍的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。