微信搜索 【微观技术】,关注这个不喜欢内卷的程序员。
精彩文章汇总 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ,汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识
面对复杂的业务场景,千变万化的客户需求,如何以一变应万变,以最小的开发成本快速落地实现,同时保证系统有着较低的复杂度,能够保证系统后续de持续迭代能力,让系统拥有较高的可扩展性。
这些是一个合格的架构师必须修炼的基础内功,但是如何修炼这门神功???
不要着急,慢慢看下去。学了真本事,拿了阿里、头条的offer,女神还会远吗!❤️💖💘
接下来我们来系统性汇总下,软件架构设计需要知晓的设计模式,主要是提炼精髓、核心设计思路、代码示例、以及应用场景等。
CRUD很多人都会,不懂设计模式也可以开发软件,但是当开发及维护大型软件系统过程中就痛苦不堪,懂了人自然听得懂我在说什么,不懂的人说了你也不会懂。
我将常用的软件设计模式,做了汇总,目录如下:
考虑到内容篇幅较大,为了便于大家阅读,将软件设计模式系列(共23个)拆分成四篇文章,每篇文章讲解六个设计模式,采用不同的颜色区分,便于快速消化记忆
本文是首篇,主要讲解单例模式
、建造者模式
、抽象工厂
、工厂方法
、原型模式
、适配器模式
,共6个设计模式。
1、单例模式
定义:
单例模式(Singleton)允许存在一个和仅存在一个给定类的实例。它提供一种机制让任何实体都可以访问该实例。
核心思路:
1️⃣ 保证一个类只有一个实例。如果该对象已经被创建, 则返回已有的对象。为什么要这样设计呢?因为某些业务场景要控制共享资源 (例如数据库或文件) 的访问权限。
2️⃣ 为该实例提供一个全局访问入口, 提供一个static
访问方法。
代码示例:
/**
* @author 微信公众号:微观技术
*/
public class Singleton {
private static Singleton instance = new Singleton();
// 让构造函数为 private,这样该类就不会被实例化
private Singleton() {}
// 获取唯一可用的对象
public static Singleton getInstance() {
return instance;
}
}
在类中添加一个私有静态成员变量用于保存单例实例,声明一个公有静态构建方法用于获取单例实例。
注意事项:
多个业务场景,多个线程访问同一个类实例的全局变量,频发的写操作,可能会引发线程安全问题。另外,为了防止其他对象使用单例类的 new
运算符,编码时需要将默认构造函数设为私有。
如果想要采用延迟初始化对象
,多线程并发初始化时,可能会有并发安全问题。假如:线程A,线程B都阻塞在了获取锁的步骤上,其中线程A获得锁—实例化了对象----释放锁;之后线程B—获得锁—实例化对象,此时违反了我们单例模式的初衷。
如何解决?
采用双重判空检查
。首先保证了安全,且在多线程情况下能保持高性能,第一个if判断避免了其他无用线程竞争锁造成性能浪费,第二个if判断能拦截除第一个获得对象锁线程以外的线程。
/**
* @author 微信公众号:微观技术
*/
public class SingleonLock {
private static SingleonLock doubleLock;
private SingleonLock() {}
// 双重校验锁
public static SingleonLock getInstance() {
if (doubleLock == null) {
synchronized (SingleonLock.class) {
if (doubleLock == null) {
doubleLock = new SingleonLock();
}
}
}
return doubleLock;
}
}
2、建造者模式
定义:
建造者模式,也称 Builder
模式。
将复杂对象的构造与其表示分离,以便同一构造过程可以创建不同的表示。
简单来说,建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同