设计模式
文章目录
设计七原则
-
单一职责
高内聚,低耦合。每个类专注于做一件事情,职责是引起变化的原因,提高内聚来减少引起变化的原因,职责越多,引起变化的原因越多
-
开闭原则
对扩展开放,对修改关闭。对类的改动是通过增加代码进行,而不是修改现有的代码,一个类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改
-
里氏替换原则
在任何父类出现的地方都可以用他的子类来替代
-
依赖倒置原则
依赖于抽象,不依赖具体实现
-
接口隔离原则
使用多个隔离的接口,而不是使用单个接口,降低依赖耦合
-
合成复用原则
合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合关系,少用继承。
-
迪米特原则
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立
设计模式三大分类
-
创建型模式
对象实例化的模式,用于解耦对象的实例化过程
-
结构型模式
把类或对象结合在一起形成一个更大的结构
-
行为型模式
类和对象交互,职责划分
创建型模式
1.单例模式
某个类只能有一个实例,提供一个全局的访问点
//懒汉式:需要时再实例化,同步保证【线程安全】,有一定的性能损耗
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
//饿汉式:类加载时就初始化,线程天生安全;浪费内存,容易产生垃圾对象
public class Singleton1 {
private Singleton1() {
}
public static final Singleton1 single = new Singleton1();
public static Singleton1 getSingle() {
return single;
}
}
//双重校验锁
public class Singleton2 {
private volatile static Singleton2 singleton2;
private Singleton2() {
}
public static Singleton2 getInstance() {
if (singleton2 == null) {
synchronized (Singleton2.class) {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
}
//静态内部类,利用类加载机制
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
//枚举 (public final class T extends Enum;public static final T INSTANCE;)
public enum Singleton {
INSTANCE,;
public void get() {
}
}
//static类型的属性会在类被加载之后才会初始化。java 类加载以及初始化都是线程安全的,虚拟机在加载枚举类的时候,会使用ClassLoader类的loadClass方法,这个方法使用同步代码块保证线程安全。
//单例并发的问题,主要解决的就是初始化过程中的线程安全问题
2.工厂模式
工厂方法、简单工厂、抽象工厂
//工厂接口
public interface IFactory {
Operation CreateOption();
}
//加法类工厂
public class AddFactory implements IFactory {
public Operation CreateOption() {
return new OperationAdd();
}
}
//客户端调用
IFactory factory = new AddFactory();
Operation operationAdd =