目录
[1. 创建型模式](#1. 创建型模式)
[2. 结构型模式](#2. 结构型模式)
[3. 行为型模式](#3. 行为型模式)
[1. 设计原则](#1. 设计原则)
[2. 设计模式](#2. 设计模式)
[1. 饿汉式](#1. 饿汉式)
[2. 懒汉式](#2. 懒汉式)
[1. 什么是代理模式](#1. 什么是代理模式)
[2. 为什么要用代理模式](#2. 为什么要用代理模式)
[3. 有哪几种代理模式](#3. 有哪几种代理模式)
[4. 静态代理](#4. 静态代理)
[5. 动态代理(解决静态代理模式缺点)](#5. 动态代理(解决静态代理模式缺点))
一、JAVA 六大设计原则
JAVA设计模式提供六个基本原则,分别是:
(1)开闭原则(OCP) - The Open-Closed Principle
(2)单一职责原则(SRP) - Single Responsibility Principle
(3)里氏替换原则(LSP) - Liskov Substitution Principle
(4)依赖倒置原则(DIP) - Dependency Inversion Principle
(5)接口隔离原则(ISP) - Interface Segregation Principle
(6)迪米特法则(DP) - Demeter Principle
二、JAVA23 种设计模式
Java中的23种设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。
1. 创建型模式
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、生成器模式、原型模式。
2. 结构型模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3. 行为型模式
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
三、设计原则与设计模式
1. 设计原则
设计原则是为了更好的设计软件的高层指导方针。它不提供具体的实现方式也不会绑定任何一种编程语言。
最常用的原则是SOLID(SRP, OCP, LSP, ISP, DIP)原则。
2. 设计模式
设计模式对关于面向对象问题的具体解决方案.比如说,如果你想创建一个类而且它在任何时刻只会有一个对象,那么你就应该使用单例类模式。
设计模式是经过大量检测的安全的做法。
四、单例模式
java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例。
1. 饿汉式
饿汉式在类创建的同时就已经创建好一个静态的对象 供系统使用,以后不再改变,所以天生是线程安全的。
2. 懒汉式
懒汉式不会立即实例化对象 ,而是在需要的时候才进行实例化,即调用**getInstance()**方法时才会创建实例。
懒汉式本身不是线程安全 的,因为多个线程可能同时进入getInstance()方法并尝试实例化对象,这可能导致创建多个实例。为了解决这个问题,可以通过加锁机制来确保线程安全。
四、代理模式
代理====>中介隔离 、方法增强(不改变原方法)
1. 什么是代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。
我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
2. 为什么要用代理模式
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
3. 有哪几种代理模式
我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
静态代理: 静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
动态代理: 动态代理是在程序运行时通过反射机制动态创建的。
动态代理分为:
基于接口的动态代理(jdk自带)
基于子类的动态代理(第三方cglib)
4. 静态代理
优点 :
(1)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
(2)代理对象可以扩展目标对象的功能;
(3)代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度
缺点 :
(1)在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
(2)增加了系统的复杂度;
创建Woman(女子)接口:
创建Woman实例(PanJinLian):
创建中介代理WangPo(媒婆)牵线 :
PanJinLian找中介WangPo牵线:
5. 动态代理(解决静态代理模式缺点)
(1)jdk自带
参数解释:
proxy: 指代我们所代理的那个真实对象。
method: 指代的是我们所要调用真实对象的某个方法的Method对象。
args: 指代的是调用真实对象某个方法时接受的参数。
Proxy这个类的作用就是用来动态创建一个代理对象的类
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader : 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载。
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了。
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上。
(2)第三方 (cglib)
依赖:
五、静态工厂
概念:静态工厂是一种特殊的工厂模式,其特点是利用一个类的静态方法来创建并返回该类或其子类的实例。这种方式允许开发者通过静态方法的调用来获取对象,而无需直接使用构造函数。
应用场景:静态工厂方法常用于创建单例对象。通过私有化构造函数,仅通过静态工厂方法提供唯一的实例获取途径,可以实现对象的重复利用,避免不必要的对象创建开销。同时,静态工厂方法还可以用于根据不同条件创建不同类型的对象。例如,在解析配置文件或处理不同数据格式时,可以根据输入的类型动态地创建相应的处理对象。
例如:面条工厂生产多种面。