设计模式是一套理论与经验,它可以提高代码的可重用性、可维护性。比如需求经常变,实现模块之间的松耦合就可以方便维护。
依赖倒置原则
依赖倒置原则,简单说就是面向接口编程。可以减少类间的耦合性,有利于并行开发。
设想这样一个场景:甲负责汽车类的建造,乙负责司机类的建造。在甲没有完成的情况下,乙是不能完全地编写代码的,缺少汽车类,编译器根本就不会让你通过!
两个类之间有依赖关系,只要制定出两者之间的接口(或抽象类)就可以独立开发了,而且项目之间的单元测试也可以独立地运行。
抽象是对实现的约束,对依赖者而言,也是一种契约,不仅仅约束自己,还同时约束自己与外部的关系,其目的是保证所有细节的发展不脱离既定契约。
单例模式
确保某一个类只有一个实例。当一个对象需要频繁地创建、销毁时,单利模式就有优势。
//java 单例模式
public class Singleton {
private Singleton() {}
private static Singleton instance=null;
synchronized public static Singleton getInstance() {//可以保证线程安全
if (instance == null)
instance = new Singleton();
return instance;
}
}
工厂模式
什么是工厂方法模式?定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
public abstract class Product {
//产品类的公共方法
public void method1(){
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}
public class ConcreteProduct1 extends Product {
public void method2() {
//业务逻辑处理
}
}
public abstract class Creator {
/*
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为 String、Enum、Enum、Class 等,当然也可以为空
*/
public abstract < T extends Product> T createProduct( Class c);
}
public class ConcreteCreator extends Creator {
public T createProduct( Class c){
Product product= null;
try {
product = (Product) Class.forName( c.getName()).newInstance();
}
catch (Exception e) {
//异常 处理
}
return (T) product;
}
}
public class Client{
public static void main( String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct( ConcreteProduct1.class);
/*
* 继续业务处理
*/
}
}
适配器模式
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
Target 目标角色。该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中的 IUserInfo 接口就是目标角色。
Adaptee 源角色。你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色。
Adapter 适配器角色。把源角色转换为目标角色,怎么转换?通过继承或是类关联的方式。
缺省适配器模式
