可见性:
单一职责原则:一个类只负责一个职责
里氏代换原则:子类可以直接替换父类,可以扩展父类的方法,但不能改变父类原有功能
开闭原则:对扩展开放,对修改关闭,实现热插拔
依赖倒转原则:模块间要依赖抽象,不要依赖实现,客户和实现解耦
接口隔离原则:接口最小粒度设计,一个类对另一个类尽量少依赖不相关的方法,抽象接口细拆开进行实现
迪米特法则:两个模块无需直接通讯就无需直接调用,使用第三方转发降低耦合度
合成复用原则:尽量先使用关联关系实现,其次才是继承复用,父类对子类是透明的(白箱复用)
如何创建对象,将对象的创建和使用分离
public class Singleton {
// 1.私有构造方法
private Singleton() {}
// 2.在本类中创建该类对象
private static Singleton instance = new Singleton();
// 3.提供公共访问方式
public static Singleton getInstance() {
return instance;
}
}
静态代码块方式
public class Singleton {
// 1.私有构造方法
private Singleton() {}
// 2.声明Singleton类型变量
private static Singleton instance; // null
// 3.静态代码块赋值
static {
instance = new Singleton();
}
// 4.提供公共访问方式
public static Singleton getInstance() {
return instance;
}
}
枚举方式
枚举类线程安全只会装载一次,唯一不会被破坏的单例模式
public enum Singleton {
INSTANCE;
}
public class Singleton {
// 1.私有构造方法
private Singleton() {}
// 2.声明Singleton类型变量
private static Singleton instance;
// 3.提供公共访问方式
public static synchronized Singleton getInstance() {
// 判断instance是否为null
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
方式二:双重检查锁 写操作才加锁优化性能
public class Singleton {
// 私有构造方法
private Singleton() {}
// 声明对象 需要volatile保证有序性
private static volatile Singleton instance;
// 对外提供方法
public static Singleton getInstance() {
// 第一次判断
if (instance == null) {
synchronized (Singleton.class){
// 第二次判断
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
方式三:静态内部类
JVM加载时不会加载内部类,只有调用内部类时才会加载
public class Singleton {
// 私有构造方法
private Singleton() {}
// 定义一个静态内部类
// JVM加载时不会加载内部类,只有调用内部类时才会加载
private static class SingletonHolder{
// 在内部类中声明并初始化外部类的对象
private static final Singleton INSTANCE = new Singleton();
}
// 对外提供方法
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
把对象创建和业务分开,有新产品只需要修改工厂类;但是产品和工厂还有耦合,新产品还需要改工厂违反开闭
![![[20240424_设计模式 GoF_1.png]]](https://1000bd.com/contentImg/2024/04/26/03316453586baaa5.png)
用户只需知道具体工厂名称;新增产品只需添加具体产品和具体工厂类,无需对原工厂修改;但是增加了系统复杂

可以保证用户使用同一个产品族的产品;但是产品族加一个产品,所有工厂类都需要修改
![![[20240424_设计模式 GoF_2.png]]](https://1000bd.com/contentImg/2024/04/26/94c42219b38c63f2.png)
用一个已创建的实例为原型创建新对象,适用于对象创建复杂,对性能安全有要求
浅克隆:非基本类型指向原有内存地址
深克隆:完全一致并独立的拷贝,可以使用序列化或者递归浅克隆或其他方式实现
将复杂对象的构建和表示分离,使同样的构建可以创建不同的表示
适用于构建复杂且各个部分独立,构建流程相对一致的
可以通过内部建造类实现链式编程

如何将类或对象按布局组成更大的结构
访问对象不直接引用目标对象;有静态代理(编译时生成)和动态代理(java运行时动态生成 JDK代理、CGLib代理)
直接在代理类中增加真实主题类的成员变量,在方法中调用真实主题类的成员变量

java中提供动态代理类Proxy,里面有静态方法newProxyInstance获取代理对象
如何让类或对象协作完成任务