创建型:
两种工厂模式细分三种:
简单工厂模式(创建一个工厂类,在if-else里面用具体type去判断和创建具体的对象)
工厂方法模式(工厂子类去实现方法,可以理解为在简单工厂模式之上又抽象一层,创建方法做成抽象方法)
抽象工厂模式(抽象工厂,下放到子类去实现,更类似于一个工厂簇)
单例模式(两个饿汉、两个懒汉、一个双重检查、一个静态内部类、一个枚举)
原型模式(克隆羊、property\ 深浅拷贝、克隆和序列化)
建造者模式(抽象出一个指挥者,在指挥者中将不同建造实现类的顺序进行排序或者调用)
结构型:
适配器模式(eg:充电器)
享元模式(eg:jdk中的integer缓存池)
装饰者模式(eg:io中的stream)
代理模式(spring中的aop、静态代理、jdk动态代理、cglib动态代理的区别)
外观模式(天猫精灵这种,隐藏内部调用,使外部调用更简洁,操控整体,一连串的命令)
组合模式(像组织架构这种,或者学院学校这种适合使用,重点是在抽象类中的方法以抛异常的形式进行默认实现)
桥接模式(跟策略模式类似,好像也没啥区别,抽象和实现分离开,也可以说是实体和行为或者属性或者具有的某个特征分离开,区别:一个是结构型,一个是行为型?)
行为型:
模版模式(将一组具有特定步骤的操作抽象成一个抽象类,在抽象类中定义好默认实现,如果子类在某一个步骤有变化就在子类中去重写该步骤,而整体步骤不变化,比如制作豆浆、不同的可能只是加入原料的步骤不同)
访问者模式 (类比绩效、或者某者类型的人看到的是不同的东西,比如成人看的可能是血腥暴力的电影,小孩看的可能是动画片之类的,貌似这种设计模式也可以做权限?)
策略模式(将行为和实体分开,将多个变化的行为抽象成对应的接口,再组合或者聚合到实体中)
迭代器模式(每个集合实现iterator接口,将数据底层的数据结构隐藏,或者说是将实现和访问分离)
观察者模式(发布订阅模式、在订阅主题里面维护一个list)
责任链模式(过滤器、netty中的handler)
解释器模式(用处不多,在解析语言或者正则的使用使用,分为终结型(类比一个表达式中的数字)和连接型,连接型中再创建对应的实现去分别处理对应的连接型字符等(类比+、-、*、%))
状态模式(审批、类的创建、连接的建立等根据具体的状态去定义或者约束可以执行的方法,可以类比组合模式中的在抽象类的方法以抛异常的形式进行默认实现)
备忘录模式 (维护一个list或者队列、栈的方式去保存历史操作,网页的后退)
命令模式 (将命令作为一个媒介,命令对象中会组合具体实现类,执行命令的方法时会去调用该命令所组合的具体实现类的方法去执行,通过命令去解耦invoker和receiver之间的关系,但是命令太多的时候会类爆炸,通过加入一个空命令的类型来避免命令的判断是个好的设计!!!,我认为线程池调用runnable的时候也是使用的这个模式,每一个runnable都作为一个具体的receiver去执行run方法)
中介者模式(类比poseidon的设计,engine类比中介者,其它模块类比参与者)
设计原则:
单一职责
开闭
迪米特(最少知道原则)
里氏替换 (父类出现的地方,子类一定可以出现,即子类可以替换父类)
依赖倒转 (针对接口编程,依赖抽象而不是依赖具体)
接口隔离 (降低耦合度,接口需要是单一职责的)
合成复用原则 (多使用聚合、组合,少使用继承,比如策略模式)
uml类图依赖关系
实现
继承
组合
聚合
关联
依赖