常用设计模式

设计模式六大原则:
开闭原则
面向对象设计/编程 终极目标(实现开闭原则)
一个是对于拓展是开放的,另一个是对于修改是关闭的
尽量不要修改已有代码
单一职责
不要让一个类承担过多的职责
里氏替换
继承父类后,尽量不要重写父类的方法。
依赖倒转
通过抽象或者接口来实现类与类之间的依赖关系。

接口隔离
建立单一接口,不要建立庞大/臃肿的接口
迪米特法则
一个实体尽可能少的与另一个实体发生接触(依赖),
只需要知道入口和结果,不必在意过程的实现。避免代码过于耦合
设计模式分类:
创建型:主要处理对象的创建,实例化对象
单例模式:
问题
对于某些场景,确保一个类只有一个实例对象是很重要的,并且这个实例是易于被访问的。
解决方案
将实例化操作隐藏在一个类中,由这个类来保证实例的创建和唯一性。
有懒汉式和饿汉式。线程安全的实现方式有,双重校验锁,静态变量,静态块,内部静态类,双重校验锁是使用 volatile 及同步关键字结合实现的,在初始化的时候先判断对象是否为空,如果为空,通过同步关键字加锁,再判断是否为空,如果为空,初始化对象。静态变量,静态块是这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,没有达到延迟加载的效果,内部静态类是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
工厂模式
简单工厂模式 工厂类根据逻辑不同,产生具体的工厂产品,该模式对于产品部分来说,它是符合开闭原则的——对扩展开放、对修改关闭;但是工厂类不太理想,因为每增加一中产品,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显自然是违背开闭原则的。
工厂方法模式是简单工厂的升级版,产品的具体创建不是由工厂进行负责,而是交给抽象工厂类的子类来实现。
抽象工厂模式
BenzSportCar和BenzBusinessCar属于产品树;同理BmwSportCar和BmwBusinessCar。而BenzSportCar和BmwSportCar和AudiSportCar属于产品族。
所以抽象工厂模式一般用于具有产品树和产品族的场景下。
结构型:处理类或对象的组合
适配器模式
问题
有时,为复用而设计的工具箱类不能够被复用的原因,仅仅是因为它的接口与专业应用领域所需要的接口不匹配。
解决方案
应用通过适配器调用接口,由适配器使得工具箱类可以被使用。
适配器模式有类适配器模式、对象适配器模式、接口适配器,类适配器通过继承来实现适配器功能。对象适配器模式通过组合来实现适配器功能。接口适配器通过抽象类来实现适配。
代理模式
问题
对象的访问需要被控制,不允许其他对象任意访问此对象接口。
解决方案
代理类开放接口提供访问,所有访问由代理类决定具体的调用。
行为型
观察者模式(发布/订阅( Publish/Subscribe)模式)
问题
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性,然而维护对象间的一致性可能导致各类之间的紧密耦合,这样将降低它们的可重用性。
解决方案
观察者模式建立一个目标和任意个依赖它的观察者,一旦目标状态发生改变,所有的观察者都得到通知。
策略模式
问题
开发中常见的情况:实现某功能可以有多种算法或者策略,可根据实际情况选择不同的算法或策略来完成该功能。如果将所有算法或策略都封装在一个类中,提供不同方法来实现,这个类就变得臃肿,而且新增算法或策略时,需要修改封装算法类的源码。
解决方案
使用不同类来封装不同的算法


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值