常考的设计模式
设计模式原则

开闭原则
对于新的需求只能进行拓展,而不能进行修改
里氏替换原则
使用的基类可以在任何地方使用继承的子类,完美的替换基类
接口隔离原则
它提倡将接口设计得小而精,避免接口臃肿和不必要的依赖关系
迪米特法则
一个对象应该对其他的对象之间的了解尽量的少
单一职责原则
一个方法只负责一个事情
依赖倒转原则
抽象不应该依赖于细节;细节应该依赖于抽象。
设计模式分类

创建型模式,结构型模式,行为型模式。
单例模式(创建型模式)
https://www.cnblogs.com/chn-cpp/articles/17448742.html
饿汉模式和懒汉模式的线程安全
饿汉模式是线程安全的。懒汉模式不是线程安全的。- 懒汉模式的线程安全的双重检测,本来只要加锁判断一个该对象是不是存在就好,但是这样干的话每次调用该函数都要枷锁,这样的话效率会变得很低,再加一层的判断是为了不
频繁加锁,影响效率
看是不是线程安全的主要看它多个线程操作的时候是不是安全的,因为饿汉模式多个线程只做一件事情,那就是取得该对象的地址,而不会修改,但是懒汉模式是会同时操作同一个对象的,所以是不安全的。
应用场景
- 饿汉模式
是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。 - 懒汉模式
是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。
看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式
工厂模式(创建型模式)

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
简单工厂模式(不属于设计模式,是一种编程习惯)
简单的将所有的抽象产品类放进具体工厂里面,需要该对象的时候将其通过特定的接口取出来。
- 简单工厂模式分为以下几个角色:
具体工厂:实现抽象工厂接口,创建具体的产品。
抽象产品:定义产品的接口。
具体产品:实现抽象产品接口,是工厂创建的对象。

工厂方法模式
简单模式中只有产品是抽象的,但是工厂方法模式将工厂也进行抽象化,只有具体到某个工厂对象才能创建特定的对象。
- 工厂方法模式分为以下几个角色:
抽象工厂:一个接口,包含一个抽象的工厂方法(用于创建产品对象)。
具体工厂:实现抽象工厂接口,创建具体的产品。
抽象产品:定义产品的接口。
具体产品:实现抽象产品接口,是工厂创建的对象。

举例:手机是一个抽象产品,小米手机、华为手机、苹果手机是具体的产品实现,而不同品牌的手机在各自的生产厂家生产。
抽象工厂模式
既然有了工厂方法模式,为什么还需要抽象工厂模式呢?因为工厂方法模式创建的是一个具体的对象,因为该对象不具有范性,所以抽象工厂类是为了解决工厂方法模式不是一类对象的问题。
工厂模式的三种模式之间的区别
- 简单工厂、工厂方法、抽象工厂的区别
1)简单工厂模式:一个工厂方法创建所有具体产品
2)工厂方法模式:一个工厂方法创建一个具体产品
3)抽象工厂模式:一个工厂方法可以创建一类具体产品
观察者模式(行为型模式)
该模式又叫发布-订阅模式,建立的是一种一对多的依赖关系,使得多个观察者观察一个对象,当该主体对象发生变化的时候通知所有的观察者。
观察者模式的优点
可以解耦对象和对象之间的关系,主体对象只关心自己的变化,而观察者只需要关注主题对象的变化。
观察者的实现
https://www.cnblogs.com/chn-cpp/articles/17448896.html
装饰器模式
装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。
在原来的基础之上添加一些装饰行为,比如一个杯子类,刚开始定义一个被子的大小,之后在此基础之上添加加水,摔碎等行为之后就是装饰器模式。
适配器模式
将原来不适合该工作性质的类进行一定的装饰,使得该类可以在该环境下被合理调用,可以设想一下queue、stack等适配器就是一个很好的解释,包装了deque和list等容器。
代理模式
代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
举一个生活中的例子:比如买飞机票,由于离飞机场太远,直接去飞机场买票不太现实,这个时候我们就可以上携程 App 上购买飞机票,这个时候携程 App 就相当于是飞机票的代理商。
策略模式
策略模式是指定义一系列算法,将每个算法都封装起来,并且使他们之间可以相互替换。

浙公网安备 33010602011771号