中国风网站欣赏,制作网页的网站费用属于资本性支出吗,WordPress有客户端么,网站老提示有风险文章目录 一、享元模式定义二、例子2.1 菜鸟教程例子2.1.1 定义被缓存对象2.1.2 定义ShapeFactory 2.2 JDK源码——Integer2.3 JDK源码——DriverManager2.4 Spring源码——HandlerMethodArgumentResolverComposite除此之外BeanFactory获取bean其实也是一种享元模式的应用。 三… 文章目录 一、享元模式定义二、例子2.1 菜鸟教程例子2.1.1 定义被缓存对象2.1.2 定义ShapeFactory 2.2 JDK源码——Integer2.3 JDK源码——DriverManager2.4 Spring源码——HandlerMethodArgumentResolverComposite除此之外BeanFactory获取bean其实也是一种享元模式的应用。 三、其他设计模式 一、享元模式定义
类型 结构型模式 介绍 使用容器数组、集合等…缓存常用对象。它也是池技术的重要实现方式正如常量池、数据库连接池、缓冲池等都是享元模式的应用。 目的 主要用于减少 频繁创建对象带来的开销。
二、例子
2.1 菜鸟教程例子
2.1.1 定义被缓存对象
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对象。
import java.util.HashMap;public class ShapeFactory {private static final HashMapString, 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里获取
public final class Integer extends Number implements ComparableInteger, Constable, ConstantDesc {IntrinsicCandidatepublic static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);}}缓存池IntegerCache
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 propertyint 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_VALUEh 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 possibleCDS.initializeFromArchive(IntegerCache.class);int size (high - low) 1;// Use the archived cache if it exists and is large enoughif (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对象。
public class DriverManager {// List of registered JDBC driversprivate static final CopyOnWriteArrayListDriverInfo registeredDrivers new CopyOnWriteArrayList();public static Connection getConnection(String url, java.util.Properties info) throws SQLException {return (getConnection(url, info, Reflection.getCallerClass()));}CallerSensitiveAdapterprivate static Connection getConnection(String url, java.util.Properties info, Class? caller) throws SQLException {/** When callerCl is null, we should check the applications* (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
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {private final ListHandlerMethodArgumentResolver argumentResolvers new LinkedList();private final MapMethodParameter, HandlerMethodArgumentResolver argumentResolverCache new ConcurrentHashMap(256);Nullableprivate 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、设计模式——装饰器模式Decorator Pattern Spring相关源码
行为型模式
1、设计模式——访问者模式Visitor Pattern Spring相关源码2、设计模式——中介者模式Mediator Pattern JDK相关源码3、设计模式——策略模式Strategy Pattern Spring相关源码4、设计模式——状态模式State Pattern5、设计模式——命令模式Command Pattern Spring相关源码6、设计模式——观察者模式Observer Pattern Spring相关源码7、设计模式——备忘录模式Memento Pattern8、设计模式——模板方法模式Template Pattern Spring相关源码9、设计模式——迭代器模式Iterator Pattern Spring相关源码10、设计模式——责任链模式Chain of Responsibility Pattern Spring相关源码11、设计模式——解释器模式Interpreter Pattern Spring相关源码