简单工厂模式
简单工厂属于创建型模式,这是一个工厂对象决定创建出哪一种产品类的实例。简单工厂有如下角色:
- Factory工厂类,这是简单工厂模式的核心,工厂类的创建产品类的方法可以被外界直接调用,创建所需产品的对象。
- IProduct:抽象产品类,这是简单工厂所有产品的父类,负责描写所有产品的共有的公共接口。
- Product:具体产品类,这是简单工厂的创建目标。
简单工厂的使用场景:
优点:用户根据参数获得对应的产品,减少了耦合。
缺点:可实例化的类型在编译期间就已经确定。
工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。工厂方法有如下角色:
- Product:抽象产品类。
- ConcreteProduct:具体产品类,实现Product接口。
- Factory:抽象工厂类,返回一个product。
- ConcreteFactory:具体工厂类,返回ConcreteProduct实例。
简单工厂和抽象工厂的区别,简单工厂没有抽象工厂的,在需要新增产品的时候会修改工厂类,违背了开闭原则而工厂方法不会违背这个开闭原则。
建造者模式
将构成复杂对象的过程和部件解耦。
代理模式
为其他对象提供一种代理以控制这个对象。代理模式有如下角色:
- Subject:抽象主题类,声明真实主题和代理的共同接口方法。
- RealSubject:真实主题类,代理类所代表的真实主题,客户端通过代理类间接调用真实主题类的方法。
- Proxy:持有对真实主题类的引用,在其涉嫌的接口方法中调用真实的主题类中相应的接口方法执行。
代理类分为静态代理和动态代理,动态代理是在运行过程中通过反射来生成代理的对象。Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke方法。
装饰模式
在不改变类文件和使用继承的情况下,动态的扩展一个对象的功能。在装饰者模式下有如下角色:
- Component:抽象组件,就是被封装的最原始的对象。
- ConcreteComponent:组件的具体实现类。被装饰的具体对象。
- Decorator:抽象的装饰类,从外类来扩展Componet的功能。
- ConcreteDecorator:装饰者的具体实现类。
外观模式
使一个子系统的外部与内部的通信必须通过一个统一的对象来进行。有如下角色:
- Facade:外观类,知道哪些子系统处理请求,将请求代理给适当的子系统对象。
- Subsystem:用于处理外观类派出的请求。
享元模式
使用共享对象有效地支持大量细粒度的对象。
Flyweight:抽象享元角色,同事定义对象的外部状态和内部状态。
ConcreteFlyWeight:具体享元角色,实现享元角色定义的业务。
FlyWeightFactory:享元工厂,负责管理对象池和创建享元对象。
策略模式
定义一系列的算法,把每一个算法封装起来,并且使它们可以相互替换,使得算法可以独立于使用它的客户而独立变化。在策略模式下有如下角色:
- Context:上下文角色,用来操作策略的上下文环境,起到承上启下的作用,屏蔽高层模块对策略,算法的直接访问。
- Stragety:抽象策略角色,通常为接口。
- ConcreteStragety:具体的策略实现。
优点:避免了多重的判断。
缺点:每一个策略都要新的类,上层必须知道有哪些方法,违背了迪米特原则。
模板方式
定义一个算法的框架啊,将一些步骤延迟到子类中。有如下角色:
- AbstractClass类:抽象类,定义了一套算法框架。
- ConcreteClass:具体实现类。
观察者方式
定义对象间的一种一对多的关系,每当一个对象状态改变时,所有依赖它的对象都会得到通知并被自动更新。有如下角色:
- Subject:抽象主题,每个主题都可以有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- ConcreteSubject:具体主题,将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- Observer:抽象观察者,定义类一个更新接口,使得在主题更改通知的时候更新自己。
- ConcreteObserver:具体观察者,实现抽象观察者定义的更新接口。
多用在消息交换的场景,如消息队列,事件总线的处理机制。