Java常见设计模式

简单工厂模式:

1、创建一个普通类,通过if判断以及反射,判断传入参数类型,返回创建对象,Calendar应用了简单工厂模式

工厂方法模式:

1、创建一个接口或抽象类,通过子类实现方法返回创建对象。若应用层(Controller)代码不依赖于产品实例如何被创建、实现细节,则可以应用工厂模式。Collection应用了工厂方法模式,iterator()就是工厂方法

抽象工厂模式:

1、抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,强调一系列相关的产品对象(属于同一产品族)。sql包下的Connection、Statement和mabatis的SqlSessionFactory都应用了抽象工厂模式

2、产品等级结构和产品族的关系:

3、如果说工厂方法模式针对的是产品等级结构,那么抽象工厂模式针对的就是产品族

观察者模式:

1、观察者模式字如其意,可以让多个观察者监听一个指定的对象,当该对象发生改变时,它的所有观察者都会收到通知并更新。(关联行为场景,建立一套触发机制)

2、观察者要实现Observer接口、被观察者要继承Observable类

单例模式:

1、懒汉单例(调用方法时)和饿汉单例(类加载时)的单例对象初始化时机不同

1、最简单的单例懒汉模式,在多线程访问时可能出现各种问题,比如并发安全问题(线程0进入了判空if,但还没来得及创建对象,线程1页进入了判空if,此时就会创建2个不同对象,违背了单例模式)、对象创建时的指令重排问题(创建对象在底层实际是有3个步骤,可能在设置对象指向空间和初始化对象之间发生指令重排)

2、单例模式的并发安全问题,可通过加锁解决;单例模式的指令重排问题使用volatile修饰单例对象或使用静态内部类构造单例模式解决

3、单例模式可能被序列化、反序列化(底层也是通过反射创建了新对象—)和反射破坏(通过反射的setAccessible(true)可以将构造器私有权限放开,这样就破坏了私有性,从而可以创建对象)

4、可以通过在单例类内写一个readResolve()方法返回创建的单例对象,解决被序列化破坏的问题(序列化类内底层源码有相关判断);可以通过在私有构造器内加一些防御反射的判断逻辑,解决反射破坏的问题

5、使用枚举类完成单例模式,可以有效避免序列化破坏(枚举中name唯一,所以拿到的一定是1个对象)和反射破坏(枚举类的构造器比较特殊,可以有效防止反射破坏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值