设计模式
单例是一种设计模式,用于限制一个类只能有一个实例化对象。在单例模式中,类自身负责确保只能创建一个实例,并且提供一个全局访问点供其他对象使用。
单例模式的主要目的是在程序中创建一个唯一的实例,并提供一种方便的方式使其他对象可以访问到这个实例。这可以有效地控制资源的使用,避免不必要的实例化和对象创建操作,提高性能和代码的可维护性。
常见的单例实现方式有两种:饿汉式和懒汉式。
饿汉式单例在类加载时就创建并初始化一个实例,无论是否被使用,都会一直存在于内存中。这种方式简单直观,但可能会造成资源浪费。
懒汉式单例在第一次使用时才进行实例化,延迟了对象的创建,避免了不必要的资源消耗。但需要考虑线程安全性,因为多个线程可能同时进入实例化方法,需要使用同步机制进行处理。
此外,还有双重检查锁模式:
双重检查锁模式(Double-Checked Locking Pattern)是一种用于实现延迟初始化的线程安全设计模式。这种模式主要用于在多线程环境下创建单例对象。它通过在锁的基础上添加额外的条件判断,在锁的开销相对较小的情况下,提高了对象的创建效率。
在双重检查锁模式中,关键点有两个:
使用两个判断条件进行检查:首先检查实例是否已经被创建,如果没有,则进入同步代码块;在同步代码块内部再次检查实例是否已经创建,如果没有,则进行实例的创建。
使用 volatile 关键字修饰实例变量:通过使用 volatile 关键字,确保多个线程对实例的可见性,即每次读取实例都是从主内存中读取,而不是线程的本地内存。
单例模式的应用场景包括:
1. 系统中只需要存在一个实例对象,比如全局的配置信息、线程池、日志对象等。
2. 需要频繁创建和销毁的对象,例如连接池、缓存等。
需要注意的是,单例模式虽然有一些优点,但也有一些缺点。例如,它可能增加代码的复杂性,使得对象之间的关系难以理解和调试。单例模式还可能引入全局变量,在多线程环境下需要特别小心处理。
因此,在使用单例模式时需要权衡好利弊,根据具体的项目需求和场景来决定是否使用。
设计思想
KISS原则(Keep It Simple and Stupid),意为把系统做的简单到白痴都能用,就是要把程序写的简洁一些,要让所有的程序员都可以看懂。代码的可读性和可维护性是衡量代码质量的两个重要标准,而KISS原则就是保持代码可读和可维护的重要手段。
SOLID:
单一职责原则(Single Responsibility Principle),指一个类负责完成一个职责或功能。例如:一个类包含两个或两个以上业务不相干的功能,那么我们就可以认为它的职责不够单一,应该将其拆分成多个粒度更小的功能单一的类。
开闭原则(Open Closed Principle),又称为"对扩展开放、对修改关闭"原则。就是添加一个新功能时应该是在已有代码基础上扩展代码(新增模块、类和方法等),而非修改已有的代码(修改模块、类和方案分等),多态就遵循着开闭原则。
里氏替换原则(Liskov Substitution Principle),意思就是子类重写父类的方法后,不应该做不符合父类方法本意的事情。
接口隔离原则(Interface Segregation Principle),指的是我们在设计接口时应该保持接口的粒度小、高内聚、不耦合,避免定义大而全的接口。接口隔离原则与单一职责原则有些相似,接口隔离原则提供了一种判断接口是否职责单一的方法:通过调用者如何使用接口来间接的判定接口是否职责单一,如果调用者只使用部分接口或接口的部分功能,那么接口的设计就不满足单一职责原则。
依赖反转原则:高层模块不需要依赖低层模块;高层模块和低层模块应该通过抽象互相依赖;除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。
面向对象设计(Object-Oriented Design):面向对象设计是一种以对象为中心的编程范式,通过封装、继承和多态等机制将系统划分为一组对象,并定义它们的属性和行为。面向对象设计强调代码的可重用性、可维护性和可扩展性,使得系统更易于理解和修改。
DRY 原则:DRY(Don't Repeat Yourself)原则强调避免代码重复。它建议将重复的逻辑或功能提取到可重用的模块中,以减少代码量,提高代码的可维护性和可扩展性。
高内聚低耦合:高内聚指的是模块内部功能之间的相关性,一个模块应该是紧密相关的功能组合。低耦合指的是模块之间的依赖关系尽量减少,模块之间的关联性应该尽可能松散。高内聚低耦合的设计有助于提高代码的可维护性、可测试性和可重用性。
迪米特原则:迪米特原则(Law of Demeter)也被称为最少知识原则(Principle of Least Knowledge),它建议将依赖关系限制在最小范围内。一个对象应该只与其直接的朋友通信,而避免与陌生的对象交互。这种设计原则有助于减少对象之间的耦合。