文章目录
- 一、享元模式定义
- 二、例子
-
- [2.1 菜鸟教程例子](#2.1 菜鸟教程例子)
-
- [2.1.1 定义被缓存对象](#2.1.1 定义被缓存对象)
- [2.1.2 定义ShapeFactory](#2.1.2 定义ShapeFactory)
- [2.2 JDK源码------Integer](#2.2 JDK源码——Integer)
- [2.3 JDK源码------DriverManager](#2.3 JDK源码——DriverManager)
- [2.4 Spring源码------HandlerMethodArgumentResolverComposite](#2.4 Spring源码——HandlerMethodArgumentResolverComposite)
- 除此之外BeanFactory获取bean其实也是一种享元模式的应用。
- 三、其他设计模式
一、享元模式定义
类型: 结构型模式
介绍: 使用容器(数组、集合等...)缓存常用对象。它也是池技术的重要实现方式,正如常量池、数据库连接池、缓冲池等都是享元模式的应用。
目的: 主要用于减少 频繁创建对象带来的开销。
二、例子
2.1 菜鸟教程例子
2.1.1 定义被缓存对象
java
public class Circle {
private String color;
public Circle(String color){
this.color = color;
}
public void draw() {
System.out.println("Circle: Draw()");
}
}
2.1.2 定义ShapeFactory
ShapeFactory用HashMap缓存Circle对象。
java
import java.util.HashMap;
public class ShapeFactory {
private static final HashMap<String, Shape> circleMap = new HashMap<>();
public static Shape getCircle(String color) {
Circle circle = (Circle)circleMap.get(color);
if(circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color : " + color);
}
return circle;
}
}
2.2 JDK源码------Integer
-128~127会去IntegerCache里获取
java
public final class Integer extends Number implements Comparable<Integer>, Constable, ConstantDesc {
@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
缓存池IntegerCache
java
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer[] cache;
static Integer[] archivedCache;
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
h = Math.max(parseInt(integerCacheHighPropValue), 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
// Load IntegerCache.archivedCache from archive, if possible
CDS.initializeFromArchive(IntegerCache.class);
int size = (high - low) + 1;
// Use the archived cache if it exists and is large enough
if (archivedCache == null || size > archivedCache.length) {
Integer[] c = new Integer[size];
int j = low;
for(int i = 0; i < c.length; i++) {
c[i] = new Integer(j++);
}
archivedCache = c;
}
cache = archivedCache;
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
2.3 JDK源码------DriverManager
CopyOnWriteArrayList registeredDrivers 缓存DriverInfo对象。
java
public class DriverManager {
// List of registered JDBC drivers
private static final CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
public static Connection getConnection(String url, java.util.Properties info) throws SQLException {
return (getConnection(url, info, Reflection.getCallerClass()));
}
@CallerSensitiveAdapter
private static Connection getConnection(
String url, java.util.Properties info, Class<?> caller) throws SQLException {
/*
* When callerCl is null, we should check the application's
* (which is invoking this class indirectly)
* classloader, so that the JDBC driver class outside rt.jar
* can be loaded from here.
*/
ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
if (callerCL == null || callerCL == ClassLoader.getPlatformClassLoader()) {
callerCL = Thread.currentThread().getContextClassLoader();
}
if (url == null) {
throw new SQLException("The url cannot be null", "08001");
}
println("DriverManager.getConnection(\"" + url + "\")");
ensureDriversInitialized();
// Walk through the loaded registeredDrivers attempting to make a connection.
// Remember the first exception that gets raised so we can reraise it.
SQLException reason = null;
for (DriverInfo aDriver : registeredDrivers) {
// If the caller does not have permission to load the driver then
// skip it.
if (isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
// Success!
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println(" skipping: " + aDriver.driver.getClass().getName());
}
}
// if we got here nobody could connect.
if (reason != null) {
println("getConnection failed: " + reason);
throw reason;
}
println("getConnection: no suitable driver found for "+ url);
throw new SQLException("No suitable driver found for "+ url, "08001");
}
}
2.4 Spring源码------HandlerMethodArgumentResolverComposite
java
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<>();
private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache = new ConcurrentHashMap<>(256);
@Nullable
private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
HandlerMethodArgumentResolver result = (HandlerMethodArgumentResolver)this.argumentResolverCache.get(parameter);
if (result == null) {
Iterator var3 = this.argumentResolvers.iterator();
while(var3.hasNext()) {
HandlerMethodArgumentResolver resolver = (HandlerMethodArgumentResolver)var3.next();
if (resolver.supportsParameter(parameter)) {
result = resolver;
this.argumentResolverCache.put(parameter, resolver);
break;
}
}
}
return result;
}
}
除此之外BeanFactory获取bean其实也是一种享元模式的应用。
三、其他设计模式
创建型模式
结构型模式
行为型模式
- 1、设计模式------访问者模式(Visitor Pattern)+ Spring相关源码
- 2、设计模式------中介者模式(Mediator Pattern)+ JDK相关源码
- 3、设计模式------策略模式(Strategy Pattern)+ Spring相关源码
- 4、设计模式------状态模式(State Pattern)
- 5、设计模式------命令模式(Command Pattern)+ Spring相关源码
- 6、设计模式------观察者模式(Observer Pattern)+ Spring相关源码
- 7、设计模式------备忘录模式(Memento Pattern)
- 8、设计模式------模板方法模式(Template Pattern)+ Spring相关源码
- 9、设计模式------迭代器模式(Iterator Pattern)+ Spring相关源码
- 10、设计模式------责任链模式(Chain of Responsibility Pattern)+ Spring相关源码
- 11、设计模式------解释器模式(Interpreter Pattern)+ Spring相关源码