单例模式
饿汉式
- 类中定义常量
- 定义常量,用静态代码块初始化
主要是利用类加载机制避免了多线程的同步问题:Java保证了类加载是线程安全的。
懒汉式
- 双重检查锁
静态内部类
在类中定义一个私有的静态内部类,然后在synchronized锁的静态外部类方法内通过内部类的类名进行访问。 利用类加载机制避免多线程的同步问题,同时只有调用了外部的静态的getInstance方法,才会加载内部类,从而完成Singleton实例化
枚举类
利用枚举类本身的特点实现单例模式,还能防止反序列化重新创建新的对象。
使用场景
需要频繁的进行创建和销毁的对象,或者创建对象消耗大的对象
- 工具类对象
- 需要创建连接的对象:数据源、session工厂
工厂模式
简单工厂模式
工厂类有一个方法,根据输入不同,返回不同的实例。
工厂方法模式
- 一个抽象工厂,生产方法是抽象方法
- 构造不同的子类,实现不同的生产方法(每个生产方法内部是简单工厂模式,根据输入判断生成的实例),每个子类之和相关的要生产的实例相关联。—-》 相当于将原本简单工厂模式中生产方法的判断条件放到了不同的子类中。
抽象工厂模式
- 定义一个接口,用于创建相关或有依赖关系的对象簇。是对工厂方法模式的进一步抽象。
原型模式
场景
创建一个和当前对象一样的对象。
- Spring
使用prototype
标注作用域的bean对象,使用原型模式进行创建。
传统方法
调用对应的构造方法,并访问现有对应的每个属性,传入构造方法。
clone方法
通过拷贝这些原型,创建新的对象。实现Clone able接口,重写Object父类的clone方法protected ``Object`` clone()
序列化、反序列化
ByteArrayOutputStream
ObjectOutputStream
建造者模式
将复杂对象的建造过程抽象出来,是这个抽象过程的不同实现方法可以构造出不同表现的对象。
允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不需要知道内部的具体构建细节。
四个角色
- Product具体的产品
- Builder 抽象构建者,创建一个Product对象的各个部件指定的接口/抽象类
- ConcreteBuilder 具体的建造者,实现接口,构建和装配各个部件
- Director 指挥者,使用Builder接口的对象。隔离客户和对象的生产过程,负责控制构造对象的过程。
Builder会聚合到Director类内部,通过构造器或者setter方法注入。