设计模式六大原则
- 单一职责原则:一个类或者一个接口,最好只做一件事情,当发生变化时,它只能受到单一影响;职责过多,引起变化的原因也多,导致职责和功能上的以来,影响内聚性和耦合度。
- 开闭原则:对扩张开放,对修改关闭。不能修改已有代码,实现热拔插。
- 里氏代换原则:任何基类出现的地方,子类一定可以出现。里氏代换原则时对开闭原则的补充,实习开闭原则的关键在于抽象化,基类和子类的继承 关系就是抽象化的具体实现。
- 依赖倒装原则:这个时开闭原则的基础:面向接口编程,依赖于抽象而不依赖于具体。
- 接口隔离原则:使用多个隔离的接口,比使用单个接口好。
- 迪米特原则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相互独立。
- 合成复用原则:尽量使用合成聚合的方式。
代理模式
定义:为其他对象提供一种代理以控制这个对象的访问。某些情况下一个对象不适合或者不能直接引用另一个对象,而是代理对象可以在客户端和目标对象之间起到中介作用。
例如:Thread实现了Runnable接口,但实现了很多其他功能,比如分配CPU和检查线程是否启动等。
策略模式
定义:定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换。让算法独立于使用他的客户而独立变化。将算法的责任委派给不同的对象处理,在比较和排序时经常使用。
例如:比较排序时实现compartor接口,而不是重写camparable接口。
单例模式
定义:保证系统中一个类只有一个实例。
例如: 线程池,日志应用。 Spring IOC控制的bean时单例,Hibernate的SessionFactory可以写成单例。
单例模式的实现:
- 懒汉模式:将构造函数设成private,定义static变量来存储实例,调用getInstance方法获得实例,方法内部判断是否已经建立实例,没有就创建,否则返回实例。 线程不安全,有可能两个线程同时检测到没有实例而同时创建实例。
- 饿汉模式:定义变量直接初始化。
- 双重枷锁:double—check:懒汉模式实现线程安全,每次获取实例的时候都需要加锁同步,影响效率,所以在外面在加一层判断,对象是否实例化,如果已经实例化过了即不需要在区加锁同步,(变量要定义成volatile类型)。将instance加官架子volatile,不然编译重排序可能造成没有初始化完成就已经完成对象引用的复制。
- 枚举实现单例。
装饰模式
定义: 在不改变原类文件和使用继承的情况下,动态地扩张一个对象的功能。他是通过创建一个包装对象,也就是装饰来包裹真实的对象。就是把想要包装的类,通过作为初始化参数传递给装饰类,然后装饰类给他加功能。
工厂模式
目的解耦和。
简单工厂模式就是一个父类产品抽象类(接口),N个子类产品继承父类,然后工厂类有一个static方法来根据不同的参数来生产不同的子类对象。
工厂模式比简单工厂模式具体化,N个子类继承一个父类,工厂类有一个父类,派生出不同子类来对N个产品子类进行生产。不同工厂生产不同的产品。
抽象工厂模式在工厂类里生产不同等级的结构产品。
优点:
- 代码结构清晰,有效的封装变化。
- 对调用者屏蔽具体的产品类。
- 降低耦合度。
- 用工厂方法代替new操作的一种模式。
- 解耦和
原型模式
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
例如:实现cloneable接口,重写clone方法。
模板方法模式
模板方法使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。子类替换掉父类中的抽象方法。
优点:模板方法是把不变行为放到超类中,去除子类中重复的代码来体现优势。