设计模式的分类
创建型模式(Creational Patterns)
结构型模式(Structural Patterns)
行为型模式(Behavioral Patterns)
创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 |
|
结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 |
|
行为型模式 这些设计模式特别关注对象之间的通信。 |
|
设计模式的关系
设计模式的理解
工厂模式(Factory Pattern)
涉及简单工厂模式和工厂模式的概念。
简单工厂模式就是一个接口或者抽象类,然后接口或者抽象类存在各类实现,然后存在一个含有静态方法的工厂类,方法根据传入的参数或者其他方式创建对应的实现类实例。
工厂模式就是两个接口,一个是产品接口,一个是工厂接口,然后每一个工厂接口的实现类分别创建一个产品接口的实现类。通过创建指定工厂实现类就可以获得指定产品类。工厂模式的工厂实现类和产品实现类是绑定在一起的。
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式就是两个以上接口,其中有两个或者以上的产品接口和一个工厂接口。然后每一个工厂接口的实现类可以根据传入参数或者其他方式创建对应的产品接口的实现类。
抽象工厂模式中,如果工厂接口的实现类只有一个,则可以把它看成是简单工厂模式。其中工厂接口的实现类就认为是简单工厂方法的静态方法工厂类。
单例模式(Singleton Pattern)
单例模式就是只存在一个实例,注意构造器的私有化,有饿汉式和懒汉式加载模式,注意线程安全问题,可以考虑利用静态内部类和枚举类创建。
单例模式注意双重检验的创建方式,其中加volatile关键字是为了防止指令重排。通过加内存屏障来实现。
建造者模式(Builder Pattern)
建造者模式强调的一个复杂产品的创建过程。一般的需要定义一个产品类,该产品可能需要多部工序才能完成。然后定义一个产品创建者接口,该接口有多个实现类,分别完成该产品的指定工序。最后存在一个执行类,该执行类主要就是按工序顺序创建产品。
原型模式(Prototype Pattern)
原型模式主要就是实现Cloneable接口,通过原型模式可以快速的克隆出一个对象实例。
原型模式实现的是浅克隆,注意浅克隆和深克隆的区别。
适配器模式(Adapter Pattern)
适配器模式主要就是在一个实现类中引入原来该类所没有的功能。一般是引入外部其他实现类功能。通过创建一个适配器,该适配器存在待引入的其他实现类的实例,然后通过在原实例中引入该适配器,进而实现其他类功能的引入。
说明:为了在一个类中可以执行其他类的方法,我们完全可以在该类中创建其他类的实例。引入适配器模式的概念仅仅只是引入中介的概念,我们通过在适配器创建其他类的实例,然后在类中引用适配器,调用在适配器创建好的实例。
桥接模式(Bridge Pattern)
桥接模式主要就是定义一个抽象类,该抽象类定义了对象的某些属性类,通过该抽象类可以将对象的属性类关联在一起。
桥接模式的主要作用就是可以将对象的各种特性通过一个中介类关联在一起,通过往中介类注入对象属性实例,即可构建不同属性的对象。
组合模式(Composite Pattern)
组合模式又叫部分整体模式。主要用来创建了对象组的树形结构。
装饰器模式(Decorator Pattern)
装饰器模式有些类似于静态代理的模式,主要区别在于静态代理通过中介类时产生的是新的实例,而装饰器模式通过中介类时仍为原来实例。
通过将需要装饰的类传入指定中介类中,在中介类中实现接口方法,调用传入类的方法和新增其他方法来到达功能的增强。
外观模式(Facade Pattern)
外观模式类似于系统门户,通过定义一个中介类,该中介类持有系统指定对象实例,外界对于系统指定对象的实例的方法的访问都是通过中介类进行的。
享元模式(Flyweight Pattern)
享元模式实质就是对象缓冲池,通过缓存创建的对象达到复用效果。避免重复创建对象。
代理模式(Proxy Pattern)
代理模式分为静态代理和动态代理。
静态代理类似于装饰器模式,主要区别在于静态代理通过中介类时产生的是新的实例,而装饰器模式通过中介类时仍为原来实例。
静态代理通过中介类实现接口,然后实例化代理类,后期对于对象的访问都是通过中介类进行的。
动态代理包括JDK动态代理和CGLIB动态代理。JDK动态代理只能代理含接口的实现类。CGLIB一般用来代理没有被final修饰的类,不要求有接口。被final修饰的类无法用这两种代理。
责任链模式(Chain of Responsibility Pattern)
定义一个抽象类,该抽象类实现了责任链中下一个对象的注入,通过这种方式,对象之间组成链。请求执行时如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
命令模式(Command Pattern)
一个类A存在多个方法,通过创建接口和实现类,让每一个实现类去调用A类的一个或者多个方法,命令模式将对于对象的某个方法的调用转移到通过指定类来对于对象该方法的调用。
解释器模式(Interpreter Pattern)
通过定义一个终结符表达式,该表达式定义了指定运算,后期所有其他表达式都是基于该终结符表达式的运算来计算的。解释器模式主要是通过终结符表达式来解析我们定义的指定运算。
迭代器模式(Iterator Pattern)
迭代器模式主要是将对于集合的遍历转移到对于迭代器的访问上来,通过定义接口,接口上有next和hasNext方法,传入集合,调用hasNext依次访问集合中元素,并将该迭代器暴露出去。外部对象可以通过该迭代器访问集合的元素。
中介者模式(Mediator Pattern)
定义一个中介类,该中介类持有要相互通信的多个对象的实例,对象与对象之间的通信交互是通过中介类来协调交互的。
中介者模式通过创建一个中介类来避免要与一个类交互式时需要引入该对象实例的问题。
备忘录模式(Memento Pattern)
定义一个备忘录类,用于在程序运行过程中在指定位置保存指定对象的信息,方便后期故障恢复。
观察者模式(Observer Pattern)
定义一个中介类,该中介类持有被观察的所有实例对象,一旦状态发生改变,所有被观察的对象都能根据中介类的协调来对状态的改变做出自己的反应。
观察者模式将状态改变所带来的对象之间的通信改为都是由中介类进行处理的。
状态模式(State Pattern)
定义一个中介类,通过该中介类来维护对象之间的状态改变。对于注入中介类的对象,我们只知道它的状态,我们无法知道它状态改变的过程,以及如何改变的。
策略模式(Strategy Pattern)
定义一个中介类,通过外界往中介类传入不同的对象实例来执行不同的方法逻辑。对于传入的对象实例,我们需要清楚它的内部结构。
模板模式(Template Pattern)
定义一个抽象类,该抽象类存在一个用fina修饰的不可被重写的方法,该方法内定义了一序列步骤流程。抽象类的实现类只需实现步骤流程内的方法即可。
访问者模式(Visitor Pattern)
定义一个中介类,该中介类持有被访问对象的实例,根据传入的访问者不同,执行访问者预先定义好的对于被访问对象的访问方法。
这里涉及到采用this关键字实现回调。
说明:本文为本人学习完设计模式后总结所得,部分图片和文字可能参考部分博客,如有侵权,请及时联系我进行删除。