设计模式

设计模式不是高深技术,奇技淫巧,只是一种设计思想,针对不同的业务场景,最本质的目的是解耦,为了可扩展性和健壮性。
http://c.biancheng.net/design_pattern/
参考
https://blog.csdn.net/qq_24309787/article/details/82257772
https://www.cnblogs.com/fengyumeng/category/1392041.html

一、单例

私有构造方法,对外提供获取实例的方法
懒汉式 线程安全(性能)/线程不安全
饿汉式 线程安全
懒汉式 双重校验锁 (volatile保证指令不重排)
静态内部类 (静态内部类加载时机

二、工厂模式

简单工厂模式 由工厂统一实例化,增加的中间过程可以统一插入其他操作;但是不符合开闭原则,添加产品需要添加修改工厂方法
工厂模式 符合开闭原则,将实例化延迟到子工厂,添加产品需要添加子工厂及其具体产品类
抽象工厂模式 侧重创建一系列相关或相互依赖的对象。抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

三、生成器模式

builder接口 concreteBuilder具体建造者 director指导者调用builder接口来控制构建的细节
跟工厂方法模式对比:工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从 代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。构建者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。
  两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。
https://blog.csdn.net/lj1314ailj/article/details/79744656
https://www.cnblogs.com/ChinaHook/p/7471470.html
https://blog.csdn.net/lj1314ailj/article/details/79744656
https://www.cnblogs.com/ChinaHook/p/7471470.html

四、原型模式

直接在堆内存中复制一个对象实例,比类加载new一个实例效率高,但是内部的数组和引用对象不会拷贝,共享变量,其他的原始基本类型和String类型会被拷贝。
https://www.cnblogs.com/fengyumeng/p/10646487.html

五、责任链模式

就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。
https://www.cnblogs.com/fengyumeng/p/10839570.html
https://www.jianshu.com/p/9f7d9775bdda
https://www.cnblogs.com/aeolian/p/8888958.html

六、命令模式

invoker:命令调用者,持有命令对象,可调用命令对象excute()方法
command:命令对象,持有接收者(被调用者),有一个excuete()方法执行接受者的动作
receiver:接收者,动作执行者
client:设置命令的接收者,往命令调用者中设置命令对象,调用invoker
场景一:应用程序支持撤销和恢复
场景二:记录请求日志,当系统故障这些命令可以重新被执行
场景三:想用对象参数化一个动作以执行操作,并且用不同命令对象来替换回调函数
https://blog.csdn.net/liuzhengwangyang/article/details/88312800

七、迭代器模式

提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。
从该设计模式中我们可以看到接口的应用,面向接口编程的概念,以及元素的遍历与实现分离,实现了高内聚和低耦合。
1.Iterator:迭代器角色 定义访问和遍历元素的接口
2.ConcreteIterator:持有具体聚集对象,实现具体迭代方法,记录当前位置
3.Aggregate:抽象聚集对象,定义创建具体迭代器的接口
4.ConcreteAggregate:持有一个对象的集合,实现创建具体迭代器的接口返回迭代器

八、中介者模式

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互
Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
Colleague:同事,相关对象
https://zhuanlan.zhihu.com/p/92132932

九、观察者模式

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
Subject:主题,维护所有观察者,特定时刻通知所有观察者
Observer:观察者 提供公共方法给主题下发通知

十、策略模式

策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
1.Strategy:策略类 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
2.Context:环境类 持有一个策略类的引用,最终给客户端调用。
十一、模板模式
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
1.Abstract:抽象类 负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法(抽象方法 具体方法 钩子方法)构成
2.ConcreteClass:具体子类 实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

十一、适配器模式

适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
1.目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
2.适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。(中间过程)
3.适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
https://blog.csdn.net/wwwdc1012/article/details/82780560

十二、桥接模式

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
1.抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。(持有维度一对象,同时声明维度二接口,即组合了两个维度)
2.扩展抽象化(RefinedAbstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。(实现维度二接口,即控制维度二同时持有可设置的维度一对象)
3.实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。 (维度一对象接口)
4.具体实现化(ConcreteImplementor)角色:给出实现化角色接口的具体实现。
https://www.cnblogs.com/WindSun/p/10260547.html

十三、装饰模式

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
1.抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。(定义所有组件接口)
2.具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。(需要被装饰的组件)
3.抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
4.具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。(持有被装饰对象,调用被装饰对象方法并增强)

十四、外观模式

外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
1.外观(Facade)角色:为多个子系统对外提供一个共同的接口。
2.子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

十五、享元模式

享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
1.抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
2.具体享元(ConcreteFlyweight)角色:实现抽象享元角色中所规定的接口。
3.非享元(UnsharableFlyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。(参数形式传入,不是属性,不持有,否则没法复用共享元对象)
4.享元工厂(FlyweightFactory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

十六、代理模式

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
1.抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
2.真实主题(RealSubject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
3.代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

面试
https://www.cnblogs.com/shan1393/p/9144491.html
https://blog.csdn.net/xiongluo0628/article/details/82107307
https://www.jianshu.com/p/ace7de971a57
http://www.sohu.com/a/321572744_465221
https://zhuanlan.zhihu.com/p/58787964

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值