1.单例模式
    2.原型模式
    3.工厂方法模式
    4.抽象工厂模式
    5.建造者模式

    创建型模式关注点“怎样创建出对象”,“将对象的创建与使用进行分离”
    降低系统的耦合度
    使用者无需过度关注对象的创建细节
    对象的创建由相关工厂来完成(工厂模式)
    对象的创建由一个建造者来完成(建造者模式)
    对象的创建由原来对象克隆完成(原型模式)
    对象始终在系统中只有一个实例(单例模式)

    单例模式:
    分为懒汉模式和恶汉模式
    多用懒汉模式:懒汉模式需要双端检索同时保持可见性,和防止指令重排(加volatile)
    应用场景:多线程中的线程池,数据库的连接池,系统环境信息,上下文(ServletContext)
    面试问题:系统环境信息,spring中怎样保持组件单例,ServletContext是什么?是单例吗?怎么保证?ApplicationContext是什么?是单例吗?怎么保证?数据库连接池一般是怎么创建出来的,怎么保证单实例?

    原型模式:用于创建重复的对象,同时又能保证性能
    image.png
    实现Clonable接口,可重写clone方法
    image.png
    image.png
    image.png
    存在深拷贝与浅拷贝方式
    浅拷贝只需要实现克隆接口即可,但是存在引用数据类型赋值地址值的问题
    深拷贝需要解决被浅拷贝对象中引用数据类型克隆的问题,实现了被克隆对象中的引用类型的克隆即可完成深拷贝,还有另外一种方法即为对被克隆对象进行序列化即可。
    应用场景:资源优化,性能和安全要求,一个对象多个修改者的场景;一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象供调用者使用

    工厂模式:提供一种创建对象的最佳方式,我们不必关心对象的创建细节,只需要根据不同情况获取不同产品
    简单工厂(静态工厂),工厂方法(多态工厂),抽象工厂
    image.png
    简单工厂模式:先定义一个产品的抽象类,在定义具体的产品,对抽象产品类进行继承或者实现,然后再定义工厂类,工厂类中有制造方法,需要传入一个产品类型的参数,该制造方法根据传入的产品类型参数确定制造的产品类型。(弊端:虽然可以增加新的产品类,但是需要在工厂类的制造方法中修改源代码,扩展性不高,违背开闭原则)
    image.png
    工厂方法模式:工厂方法模式与简单工厂模式的差别主要在于工厂方法模式对工厂类进行的抽象,同时对工厂的职责进行了进一步的划分,提出了一个抽象工厂,抽象工厂中有一个抽象方法,具体的工厂实现具体的产品制造方法,这样能够更好的扩展新的产品,如果需要生产新的产品只需要确定新产品类,同时添加新的专职工厂即可
    image.png
    抽象工厂:简单工厂模式与工厂方法模式都是对单一类型的产品进行扩展制造,如果需要制造新类型的产品,则不易扩展,抽象工厂则可以实现这一目的,抽象工厂具备扩展所有类型产品的方法,具体工厂实现具体方法即可。

    image.png
    image.png
    image.png
    建造者模式:当一个类的构造函数参数超过4个,有些参数是可选参数时,可以考虑使用建造者模式
    在被建造者类中创建一个静态内部类Builder,然后将被建造类的参数都复制到Builder类中,
    被建造者的构造函数的参数为这个静态内部类Builder,构造函数内部的参数赋值是通过静态内部类中的参数的setter方法来实现的。