创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
类型
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
实例化
实例化是用类创建对象的过程,有以下4种方式实现:
1.new
2.反射
3.clone
4.反序列化
工厂三姐妹
简单工厂(不是设计模式)
减少if...else... 形成map
工厂方法
一个独立自治的子类自己实例化对象类型
目的
子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
实现核心
1.接口类提供一个创建对象的方法
2.子类实现接口,重写方法
3.工厂类,通过ifelse类型,创建不同对象,调用者通过使用工程类,传入不同类型,创建出不同类型对象
抽象方法
创建超级工厂按照工厂模式创建对象
实现核心
invoke
代理工厂 反射过来具体工厂
单例
创建一个全局访问唯一的对象,避免重复全局使用的类频繁创建和销毁对象
目的
保证类的对象在内存中唯一,频繁创建对象,会造成堆空间不足,引发GC
优点
内存中唯一一个实例,减少内存开销、降低创建和销毁对象的频率,共享资源
缺点
无接口 继承,难于扩展
使用不当会出现内存泄露
使用static修饰单例对象,长生命周期的对象持有短生命周期对象的引用,短周期对象无法GC,单例对象初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,就造成外部引用无法GC,造成内存泄露
实现核心
没有接口,没有依赖组合关系
不能继承
单例模式原则
1.私有构造。(阻止类被通过常规方法实例化)
2.以静态方法或者枚举返回实例。(保证实例的唯一性)
3.确保实例只有一个,尤其是多线程环境。(保证在创建实例时的线程安全)
4.确保反序列化时不会重新构建对象。(在有序列化反序列化的场景下防止单例被莫名破坏,造成未考虑到的后果)
建造者
创建一个复杂,千人千面的对象,通过相同构建步骤、调整构建顺序、部件数量等手段建造出一个多样化的产品(对象)
目的
实现了对象的属性与构建的分离,隐藏构建的细节
实现核心
依赖倒转
抽象类+接口
1.复杂对象接口,对外暴露可控产品组装方案
2.抽象类Builder实现复杂对象的接口,提供统一必须实现的组装方法模板
3.不同具体建造者继承抽象类,扩展各自重写组装方案
4.实现:通过调整步骤、增减组装方法,组装不同表现的产品
原型
创建重复的对象
目的
减少new的次数,通过拷贝实现创建对象,效率比new高
实现核心
自我复制,克隆 拷贝
1.原型类为抽象类且实现Cloneable接口,重写clone方法clone方法、可以增加扩展抽象方法
重写clone方法:
浅克隆:super.clone
深克隆:super.clone+原型类中的对象也克隆一份
2.具体子类继承抽象类,并重写扩展类