创建型设计模式

创建型设计模式

主要包括:单例模式、工厂模式、建造者模式、原型模式。

主要功能:解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。

1. 单例模式

定义:用来创建全局唯一的对象。一个类只能创建一个对象(实例),那这个类就是一个单例类,这种模式就叫单例模式。

实现方式:饿汉式、懒汉式、双重检测、静态内部类、枚举。

使用场景:如果单例类,没有后续扩展需求,并且并不依赖外部系统,那么设计成单例类是可以的。对于一些全局类,我们在其他地方 new 的话,还在类之间传来传去的,不如直接做成单例类,使用起来简洁方便。

缺点

1. 单例对 OOP 特性支持的不是很好
2. 单例会隐藏类之间的依赖关系
3. 单例对代码的扩展性不好
4. 单例对代码的可测试性不好
5. 单例不支持有参数的构造函数

单例模式的替代方案:可以通过工厂模式、IOC容器来保证全局唯一。

此外,进程唯一单例、线程唯一单例、集群唯一单例、多例等扩展知识点,虽然实际开发用不到,但是可以锻炼逻辑思维,扩展思路。

2. 工厂模式

工厂模式包含简单工厂、工厂方法、抽象工厂这三种细分模式。其中简单工厂、工厂方法两种比较常用,抽象工厂的应用场景比较特殊,所以很少用到,不是我们学习的重点。

定义:用来创建不同但是相关类型的对象(继承统一父类或接口的一组子类(实现类)),由给定的参数来决定创建哪种类型的对象。实际上,如果创建对象的逻辑并不复杂,我们可以直接通过 new 来创建对象就可以了,不需要使用工厂模式。当创建逻辑比较复杂,是一个大工程的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。

使用场景:当每个对象的创建逻辑比较简单的时候,推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类中。当每个对象的创建逻辑都比较复杂时,为了避免设计一个过于庞大的工厂类,推荐使用工厂方法模式,将创建逻辑拆的更细,每个对象的创建逻辑拆分到各自的工厂类中。

判断是否使用的标准

  1. 封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者更加透明。
  2. 代码复用:创建代码抽离到独立的工厂类之后,可以复用。
  3. 隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
  4. 控制复杂度:将创建代码抽离出来,让原本的函数或类职责更加单一,代码更加简单。

工厂模式经典的使用场景:依赖注入框架,比如Spring IOC、Google Guice,它用来集中创建、组装、管理对象,跟具体的业务代码解耦,让程序员集中在业务代码开发中。

3. 建造者模式

定义:建造者模式用来创建复杂对象,可以通过设置不同的可选参数,定制化地创建不同的对象。建造者模式的原理和实现比较简单,重点需要掌握使用场景,避免过度使用。

判断是否使用的标准

  1. 把类的必填属性放到构造函数中,强制创建对象的时候就设置。如果必填属性有很多,把这些必填属性都放到构造函数中设置,那么构造函数就又会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些必填属性是否填写的逻辑,就无处安放了。
  2. 如果类的属性之间有一定的依赖关系或者约束条件,继续使用构造函数配合 set() 方法的设计思路,那么依赖关系或约束条件的校验逻辑,就无处安放了。
  3. 希望创建不可变对象,也就是说,在对象创建好之后,不能再修改内部的属性值,要实现这个功能,我们就不能再类中暴露 set() 方法。构造函数配合 set() 方法来设置属性值的方式就不适用了。
4. 原型模式

定义:如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫做原型模式。

实现方式:原型模式的实现方法:深拷贝和浅拷贝。浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归的复制引用对象,以及引用对象的引用对象...而深拷贝得到的是一份完完全全独立的对象。所以,深拷贝比浅拷贝,更加耗时,更加耗内存空间。

使用场景:如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但是对可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了。在操作非常耗时的情况下,比较推荐使用浅拷贝,否则,没有充分的理由,不要为了一点点的性能提升而使用浅拷贝。

相关推荐
wrx繁星点点6 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干8 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨8 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉17 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点18 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰18 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus18 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵18 小时前
设计模式-迭代器
设计模式
lexusv8ls600h20 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc1 天前
抽象工厂模式
java·设计模式·抽象工厂模式