GoF、J2EE 设计模式

思维导图(详见博文资源)

在这里插入图片描述

学习资源

https://www.runoob.com/design-pattern/proxy-pattern.html
https://refactoringguru.cn/design-patterns/factory-method

GoF

1、单例模式(Singleton)

重要思想:构造器私有 (别人无法new这个对象)保证只有单个对象被创建

1、饿汉式:不管三七二十一,上来先把对象加载出来

多线程安全

缺点::类加载时就初始化,浪费内存(拿数组来说,有的数组new出来后以后可能并没用到)

public class Hungry {

	private Hungry() {
	
	}
	
	private static final Hungry HUNGRY = new Hungry();
	
	public static Hungry getInstance() {
		return HUNGRY;
	}
}

2、懒汉式:

①线程不安全

public class LazyMan {
	
	private LazyMan() {

	}
	
	private static LazyMan lazyMan;

	public static LazyMan getInstance() {
		if (lazyMan == null) {
			lazyMan = new LazyMan();
		}
		return lazyMan;
	}
}

②线程安全: DCL(double-checked locking)懒汉式

volatile:原子性操作 -> 避免指令重排
在这里插入图片描述

静态内部类

多线程安全

public class Holder {
	private Holder() {

	}

	public static Holder getInstance() {
		return InnerClass.HOLDER;
	}

	public static class InnerClass {
		private static final Holder HOLDER = new Holder();
	}
}

单例不安全:反射可破坏单例

2、观察者模式

适合应用场景:

  • 当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。
  • 当你使用图形用户界面类时通常会遇到一个问题。 比如, 你创建了自定义按钮类并允许客户端在按钮中注入自定义代码, 这样当用户按下按钮时就会触发这些代码。
  • 当应用中的一些对象必须观察其他对象时, 可使用该模式。 但仅能在有限时间内或特定情况下使用。
  • 订阅列表是动态的, 因此订阅者可随时加入或离开该列表。

3、工厂模式(Factory)

简单工厂模式 :对于增加新的产品,需要扩展已有代码

优点:方便调用者使用对象
缺点:没有满足开闭原则 -> 虽然某种程度不符合设计原则,但实际使用最多
在这里插入图片描述

工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展

在这里插入图片描述

二者对比

在这里插入图片描述

4、抽象工厂模式

  • 围绕一个超级工厂创建其他工厂,该工厂又称为其他工厂的工厂
  • 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
  • 不可以增加产品,可以增加产品族
    在这里插入图片描述

UML类图

在这里插入图片描述

举例

在这里插入图片描述
在这里插入图片描述

5、代理模式

应用实例:Spring AOP

5.1 动态代理

5.2 静态代理

6、原型模式


J2EE

1、MVC模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心海非海_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>