总体来说分为3类:
创建型:工厂方法模式、抽象工厂模式、单例、建造者、原型
结构型:适配器、装饰器、代理、外观、桥接、组合、享元
行为型:策略、模板方法、观察者、迭代子、责任链、命令、备忘录、状态、访问者、中介者、解释器
工厂方法模式和抽象工厂模式
要点:其实这两种模式在我看来并无太大的不同,2个要点,对象不是new出来的(当然只是看起来不是new出来的),而是通过工厂类创建的,创建的是同一接口不同实现class的实例。那么具体返回哪个实现类的实例,要么通过参数不同来区分,要么通过方法不同来区分,要么通过类不同来区分,反正总要分出来。
典型场景:需要经常性的创建同一类型的对象
难易程度:比较简单
广泛程度:非常广泛
单例
要点:保证一个类的实例,在一个jvm当中,只有一份,简单的单例实现,包括一个私有的构造函数,一个静态私有的类对象(instance),一个静态共有的getInstance方法,但是这种方法在多线程环境下是不安全的,有可能这个instance对象会被实例化多份。可以通过 synchronized 来保证线程安全,也可以通过静态内部类(内部类是延迟加载的,可以保证在第一次用到的时候才实例化instance)持有这个instance来保证线程安全。
典型场景:某一个类的对象,系统当中只需要一份
难易程度:稍显困难(考虑线程安全的情况下)
广泛程度:非常广泛
Builder
其实,builder和factory是有其相似之处的,区别在于,factory模式当中,其实只有2类角色,工厂和产品。而在builder当中,包括了3个角色,指挥者、构造者、产品。用于创建较为复杂的对象,同时清楚地体现其中的创建过程。
典型场景:对复杂对象的创建
难易程度:稍显困难
广泛程度:比较广泛
原型
通过clone的方式,获取对象。浅克隆:调用Object的clone方法,对于对象内部的对象,不会进行克隆;深克隆:可以通过序列化的方式来实现,对于对象内部的对象,也会进行克隆。
典型场景:相似对象的创建
难易程度:深克隆的实现稍显困难
广泛程度:不太广泛