设计模式
工厂方法模式
简单工厂模式
简单工厂包括以下角色:
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能
- 具体产品:实现或者继承抽象产品的子类
- 具体工厂:提供了创建产品的机会,调用者通过该方法来获取产品
工厂方法模式
工厂方法模式的主要角色:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
优点:- 用户只需要知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创建过程
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则
缺点: - 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度
抽象工厂模式
工厂方法模式只考虑生产同等级的产品,抽象工厂可以处理多等级产品的生产
产品族:一个品牌下面的所有产品;例如华为下面的电脑,手机称为华为的产品族
产品等级:多个品牌下面的同种产品;例如华为和小米都有手机电脑为同一个等级
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象方法工厂可生产多个等级的产品。一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂
优点:当一个产品族中的多个对象被设计成一起工作时,他能保证客户端始终只能使用同一个产品族中的对象
缺点:当产品族中需要增加一个新的单品时,所有的工厂类都需要进行修改
策略模式
- 该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户
- 他通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理
策略模式的主要角色
- 抽象策略(Stateegy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的最终接口,提供具体的算法实现或行为
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用
优点:- 策略类之间可以自由切换
- 易于扩展
- 避免使用多重条件语句(if else),充分体现面对对象的设计思想
缺点: - 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 策略模式将造成产生很多策略类
责任链设计模式
责任链模式:为了避免请求发送者与多个请求处理这耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,知道有对象处理它为止
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后续连接
- 具体处理者(Concrete Handler)角色:实现抽象处理者的具体方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给他的后继者
- 客户端(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,他不关心处理细节和请求的传递过程
责任链优缺点
优点:
1. 降低了对象之间的耦合度
2. 增强了系统的可扩展性
3. 增强了给对象指派职责的灵活性
4. 责任链简化了对象之间的连接
5. 责任分担
缺点:
1. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响
2. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用
单点登录
单点登录的英文名叫做:Single Sign On(SSO),只需要登录一次,就可以访问所有信任的应用系统