创建型模式

创建型模式 在创建对象的同时,隐藏创建逻辑,不使用new直接实例化对象,程序判断需要创建哪些对象时更加灵活。 1 单例模式 一个单例类在任何情况下只存在一个实例,构造方法私有,由自己创建一个静态变量存储实例,对外提供一个静态共有方法获取实例。 只有一个实例,避免了开销 没有抽象层,难以拓展,与单一职责原则冲突。 1.1 常见写法 1.1.1 饿汉式,线程安全 类一加载就创建对象,比较常用,但是容易产生垃圾对象。 线程安全,不加锁,执行效率高 缺点:不是懒加载,浪费内存空间 public class Singleton{ private Singleton(){} private final static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 使用反射破坏单例 public class Main{ public static void main(String[] args) throws Exception{ Constructor<Singleton> declaredConstructor = Singleton.class.getDeclaredConstructor(null); declaredConstructor.setAccessible(true); Singleton singleton = declaredConstructor.newInstance(); } } 1.1.2 懒汉式,线程不安全 public class Singleton{ private Singleton(){} private static Singleton instance; public static Singleton getInstance(){ if ( instance == null ) { instance = new Singleton(); } return instance; } } 多线程破坏单例 public class Main(){ public static void main(String[] args){ for(int i=0;i<3;i++){ new Thread(() -> { System....

August 18, 2024 · 2 min · 254 words · RLTEA

结构性模式

结构性模式 通过类和接口间的继承和引用关系船舰结构复杂的对象。 1 适配器模式 当需要将两个不同接口的类进行通信时,在不修改这两个类的前提下,我们可以用中间件完成衔接过程。这个中间件就是适配器,适配器模式就是将一个类的接口,转换为客户期望的另一个接口,让原本不兼容的接口完成无缝对接。 类适配器 通过类的继承实现适配,继承Target的接口,继承Adaptee的实现 对象适配器 通过类对象的组合实现适配 target:定义Client真正需要的接口。 Adaptee:其中定义了一个已经存在的接口,也就是我们需要进行适配的接口。 Adapter:对Adaptee和Target的接口进行适配,保证对target中接口的调用可以间接转换为对Adaptee中接口的调用。 优点: 提高了类的复用 组合若干关联对象对外提供统一服务接口 扩展性、灵活性号 缺点: 过多使用适配器模式容易导致代码功能和逻辑意义混淆。 部分语言对继承的限制,可能至多只能适配一个适配者类么日期目标类必须是抽象类。 2 桥接模式 3 组合模式 4 装饰模式 5 外观模式 6 享元模式 7 代理模式 代理模式本质是一个中间件,主要目的时解耦合服务提供者和使用者。 使用者通过代理间接访问服务提供者,便于后者的封装和控制。 RealSubject:真正的目标对象 Proxy:目标对象的代理,负责控制和管理目标对象,并间接传递外部对目标对象的访问 Remote Proxy:对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者。 Virtual Proxy:当目标对象创建开销比较大时,可以使用延迟或者异步的方式创建目标对象 Protection Proxy:细化对目标对象访问权限的控制 静态代理和动态代理的区别 动态代理更加灵活,不需要必须实现接口,可以直接代理实现类,并且可以不需要整堆每个目标类都创建一个代理类。 静态代理中,一旦新增方法,目标对象和代理对象都要修改。 JVM中,静态代理在编译时就将接口、实现类、代理类编译成class文件,动态代理是在运行时动态生成字节码文件,加载到JVM中的。

August 18, 2024 · 1 min · 45 words · RLTEA

行为型模式

行为型模式 通过类之间不同的通信方式实现不同行为。 1 访问者模式 2 模板模式 3 策略模式 属于对象的行为模式,针对一组算法,将每一个算法封装到具有共同接口的独立类中,使得他们可以相互替换。 4 状态模式 5 观察者模式 Subject:抽象被观察对象,仅提供注册和删除观察者对象的接口声明。 ConcreteSubject:具体被观察对象,该对象中收集了所有需要被通知的观察者,可以动态增删集合中的观察者,当状态发生变化时,会通知所有观察者对象。 Observer:抽象观察者,为所有观察者定义获得通知的同一接口。 ConcreteObserver:观察者对象,关注对象为Subject,能接受Subject变化是发出的通知并更新自身状态 优点: 被观察者和观察者之间时抽象耦合的 耦合度较低,两者之间关联仅在于消息通知 被观察者者无需关心他的观察者 支持广播通信 缺点: 观察者只知道被观察对象发生了变化,不知道过程和原因 观察者同时可能是被观察者,消息链路可能过长 如果观察者和被观察者之间产生循环依赖,会导致无限循环 6 备忘录模式 7 中介者模式 8 迭代器模式 9 解释器模式 10 装饰器模式 对现有类对象进行包装,在不改变类对象和定义情况下,添加额外功能。 是一种对象结构型模式。 Component:对象的接口类,定义装饰对象和被装饰对象的共同接口 ConcreteComponent:被装饰对象的定义 Decorator:装饰对象的抽象类,持有一个具体被修饰的对象,并实现接口类继承的公共接口 ConcreteDecorator:具体的装饰器,负责王被装饰对象添加额外功能。 final修饰的类无法使用继承来拓展对象行为,此时可以使用装饰模式进行拓展。 11 命令模式 12 责任链模式 一个请求沿着一条链传递,直到该链上某个处理者处理它为止。 当程序需要使用不同方法处理不同种类请求时,而且请求类型和顺序预先未知时。使用责任链模式,收到请求后,按顺序询问每个处理者是否能够处理

August 18, 2024 · 1 min · 49 words · RLTEA

软件设计原则与UML类图

软件设计原则与UML类图 1 软件设计原则 开闭原则(Open Closed Principle, OCP):对扩展开发,对修改关闭 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责 里氏替换原则(Liskov Substitution Principle, LSP):所有引用基类的地方必须能透明地使用其子类对象 依赖倒置原则(Dependency Inversion Principle, DIP):依赖于抽象,不能依赖于具体实现 接口隔离原则(Interface Segregation Principle,ISP):类之间地依赖关系应该建立在最小的接口上 合成/聚合复用原则(Composite/Aggregate Reuse Principle,C/ARP):尽量使用合成/聚合,而不是用过继承达到复用的目的 最少知识原则(Least Knowledge Principle,LKP)或迪米特法则(Law of Demeter, LOD):一个软件实体应当尽可能少的与其他实体发生相互作用。 2 UML类图 3 Spring使用了哪些设计模式 工厂设计模式:Spring使用工厂模式通过Beanfactory、ApplictionContext创建Bean对象 代理设计模式:Spring AOP功能的实现 单例设计模式:Spring中的Bean默认都是单例的 模板方法模式:Spring中jdbcTemplate、hibernateTemplate等以Template结尾对数据库操作的类 包装器设计模式: 观察者模式:Spring事件驱动模型 适配器模式:Spring AOP的增强或者通知使用到了适配器模式,Spring MVC中也使用了适配器模式适配Controller 4 JDK使用了哪些设计模式 桥接模式 适配器模式 组合模式 装饰器模式 享元模式 代理模式 抽象工厂模式 建造者模式 工厂方法 原型模式 单例模式 责任链模式 命令模式 解释器模型 中介者模式 备忘录模式 空对象模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式

August 18, 2024 · 1 min · 69 words · RLTEA