设计模式的分类
>>创建型模式
简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
>>结构型模式
代理模式、适配器模式、装饰器模式、外观模式、桥接模式、享元模式
>>行为型模式
观察者模式、责任链模式、模板方法模式、策略模式、迭代子模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
模式介绍
1.简单工厂模式
定义一个创建不同对象的工厂类,在类方法里根据参数创建出不同的对象。简单好用但是如果要扩展必须改工厂类方法代码。
2.工厂方法模式
定义一个创建对象的父类,在父类里定义一个创建对象的抽象方法。通过在子类中实现抽象方法的方式可以创造出不同的对象。好处是扩展新类型对象时不用改动父类,只用新建一个子类实现抽象方法就行了。问题是创建不同的对象要知道不同的子类,为了解决这个问题又有了抽象工厂模式。
3.抽象工厂模式
定义一个接口用于创建相关或者有依赖关系的对象族,而无需指定具体类。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
优点
1.分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
2.易于交换产品系列。一个具体工厂类只在初始化时出现一次,这使得改变一个应用的具体工厂变得很容易,只需改变具体的工厂即可使用不同的产品配置。
3.有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点
难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
三种模式的使用选择
简单工厂:用来生产同一等级结构中的任意产品,但不支持扩展增加产品。
工厂方法:用来生产同一等级结构中的固定产品,支持扩展产品。
抽象工厂:用来生产不同产品族的全部产品,支持产品扩展,支持产品族扩展。
4.单例模式
确保一个类全局只有一个实例并提供一个访问点。单例模式分为预加载和懒加载模式。
预加载:一般用static的形式在类没有使用的时候已经完成初始化对线程安全但是如果没有被用到会造成内存浪费。
懒加载:为了避免内存浪费使用懒加载模式在用到单例对象的时候再创建,因为创建对象不是原子操作所以不是线程安全的,可以通过synchronized进行同步操作保证原子性。
public class Singleton { private static volatile Singleton instance = null; private Singleton() { }; public static synchronized Singleton getInstance() { if (instance == null) { synchronized (instance) { if (instance == null) { instance = new Singleton(); } } } return instance; } }