一、设计模式
设计模式分为三大块,创建模式、结构模式和行为模式。
-
创建模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
-
结构型模式:适配器模式、装饰模式、组合模式、外观模式、享元模式、代理模式
-
行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
单例模式
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
例如:Windows TaskManager、Recycle Bin、网络计数器、文件系统、数据连接池
优点:只生成一个实例,内存开销较小
实现方法:饿汉式、懒汉式、双重检测锁式、静态内部类、枚举单例
普通方式:饿汉和懒汉
1 _饿汉:饿汉不可以实现延时加载
2 _懒汉:懒汉在加载时有锁,效率低,否则线程不安全
## 饿汉式:
-
私有的构造器
-
静态对象(直接加载) 不能延时、立即加载
-
公有getInstance() static return instance
加载类、天然的线程安全
## 懒汉式:
- 私有构造器
- 静态对象(没有初始化)
- getInstance() instance != null <- 线程问题 同步锁 synchronized
资源利用率高了,但每次都要同步并发效率低。
## 双重检测锁
将同步块放在if块中 不推荐使用,在不同的JVM中可能会有错误
## 静态内部类
public class SingletonDemo{
private static class SingletonClassInstance{
private static final SingletonDemo instance = new SingletonDemo();
}
public static SingletonDemo getInstance(){
return SingletonClassInstance.Instance;
}
private SingletonDemo(){
}
}
- 外部类没有static属性,则不会像饿汉式那样立即加载对象。
- 只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。instance是static final 类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性。
- 兼备了并发高效调用和延迟加载的优势
## 枚举模式
简单、好用
没有延时加载;防止反射和反序列化漏洞
工厂模式
实现了创建者和调用者的分离
用方法代替new操作
面向对象设计的基本原则:
-
OCP(开闭原则):一个软件的实体应当对扩展开放,对修改关闭。
-
DIP(依赖倒转原则):要针对接口编程,不要针对实现编程。
-
LoD(迪米特法则):只与你直接的朋友通信,而避免和陌生人通信。
简单工厂:又称为静态工厂 违反开闭原则
但是只要对工厂类进行修改,代码量不大
工厂方法模式:代码量较大,符合开闭原则
抽象工厂模式
对产品族进行抽象实现
建造者模式
单独构造和装配的分离
原型模式
避免重新执行构造步骤
实现数据复用
实现cloneable接口和重写clone()
cloneable空标记接口 代码规范
浅克隆:克隆引用对象地址
深克隆:同时复制一份对象(在clone()中添加)
也可以通过序列化和反序列化复制(深克隆)