创建型模式:单例模式、工厂模式、建造者模式、原型模式
单例模式
- 核心作用 :保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
单例模式的优点
- 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要
比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动
时直接产生一个单例对象,然后永久驻留内存的方式来解决 - 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计
一个单例类,负责所有数据表的映射处理
常见的五种单例模式实现方式
- 主要:
- 饿汉式:线程安全,调用效率高。但是,不能延时加载。
- 懒汉式:线程安全,调用效率不高。但是,可以延时加载。
- 其它:
- 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
- 静态内部类式(线程安全,调用效率高。 但是,可以延时加载)
- 枚举单例(线程安全,调用效率高,不能延时加载)
如何选用?
- 单例对象占用资源少,不需要延时加载:枚举式好于饿汉式
- 单例对象占用资源多,需要延时加载:静态内部类式好于懒汉式
问题:
- 反射可以破解上面几种(不含枚举式)实现方式(可以在构造方法中手动抛出异常控制)
- 反序列化可以破解上面几种((不包含枚举式))实现方式! 可以通过定义readResolve()防止获得不同 对象
实现
工厂模式
- 实现了创建者和调用者的分离
- 分类
- 简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有的代码)
- 工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 抽象工厂模式:用来生成不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
- 核心本质
- 实例化对象,用工厂方法代替new操作
- 将选择实现类、创建对象统一管理和操作。从而将调用者跟我们的实现类解耦。
简单工厂模式
要点
- 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
- 对于增加新产品无能为力!不修改代码的话,是无法扩展的。
工厂方法模式
要点
- 为了避免简单工厂模式的缺点(不完全满足OCP)
- 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式 有一组实现了相同接口的工厂类。
抽象工厂模式
- 用来生产不同产品族的全部产品。(对于增加新的产品无能为力,支持增加产品族)
- 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品质、业务分类时,通过抽象工厂模式产生需要的对象是比较好的解决方法。
工厂模式要点
- 简单工厂模式(静态工厂模式)
- 虽然某种程度上不符合设计原则,但实际使用最多
- 工厂方法模式
- 不修改已有类的前提下,通过增加新的工厂类实现扩展
- 抽象工厂模式
- 不可以增加产品,可以增加产品族
建造者模式
场景
- 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?
- 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时
建造模式的本质
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出负责的对象。某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
原型模式prototype
原型模式
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
- 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点
- 优势有:效率高(直接克隆,避免了重新执行构造过程步骤) 。
- 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。
原型模式的实现
- Cloneable接口和clone方法
- Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大部分事情
浅克隆存在的问题
- 被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深克隆如何实现
- 深克隆把引用的变量指向复制过的新对象,而不是原有的被引用的对象。
- 深克隆:让已实现Clonable接口的类中的属性也实现Clonable接口
- 基本数据类型和String能够自动实现深度克隆(值的复制)
- 利用序列化和反序列化技术实现深克隆
开发中的应用场景
- 原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。
- spring中bean的创建实际就是两种:单例模式和原型模式。(当然,原型模式需要和工厂模式搭配起来)
创建型模式总结
创建型模式:都是用来帮助我们创建对象的!
- 单例模式
- 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
- 工厂模式
- 简单工厂模式
- 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
- 工厂方法模式
- 用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 抽象工厂模式
- 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
- 简单工厂模式
- 建造者模式
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。
- 原型模式
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式