大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。
结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)等。
行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为型模式有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)。
举例:
1、InputStream 是一个抽象类,标准类库中提供了 FileInputStream、ByteArrayInputStream 等各种不同的子类,分别从不同角度对 InputStream 进行了功能扩展,这是典型的装饰器模式应用案例
public BufferedInputStream(InputStream in)
2、HTTP/2 Client API,下面这个创建 HttpRequest 的过程,就是典型的构建器模式(Builder),通常会被实现成fluent 风格的 API,也有人叫它方法链。
HttpRequest request = HttpRequest.newBuilder(new URI(uri))
.header(headerAlice, valueAlice)
.headers(headerBob, value1Bob,
headerCarl, valueCarl,
headerBob, value2Bob)
.GET()
.build();
手写单例模式:
public class A{
private static A a;
private A{};
public static A getA(){
if(null == a){
a=new A();
}
return a;
}
}
以上是单线程情况下的单例模式
多线程情况下:双检锁方式:
private class A{
private static volatile A a;
private A{}
public static A getA(){
if(a==null){//避免总是进入同步代码块
synchronized(A.class){//同步.class,意味着对同步类方法调用
if(null == a){
a = new A();
}
}
}
return a;
}
}
Spring 等如何在 API 设计中使用设计模式:
BeanFactory和ApplicationContext应用了工厂模式。
在 Bean 的创建中,Spring 也为不同 scope 定义的对象,提供了单例和原型等模式实现。
AOP 领域则是使用了代理模式、装饰器模式、适配器模式等。
各种事件监听器,是观察者模式的典型应用。
类似 JdbcTemplate 等则是应用了模板模式。