没有万行的代码量,就不要想搞清楚设计模式。目前本人代码量大约在六千五百行,2016年需要继续努力,尽快完成万行之约。

  工作之余需要,下面提前简单讨论一下设计模式。

  创建型模式,共五种:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

1、代理模式

db数据库组件代理ibatis开源组件

 public static PersistService createPersistClient(String alias)
{
PersistService service = null;
try
{
service = new PersistServiceProxy(alias);
}
catch (Exception e)
{
logger.error("Failed new Instance PersistProxy.", e);
}
return service;
}
PersistService代理PersistServiceProxy(IbatisPersistServiceImpl),减少操作Connection,ResultSet繁琐对象。

2、单例模式

a、实例化线程池使用单例模式

私有化构造方法,对外暴露一个方法创建单例实例,在多线程情况下只允许一个线程处理业务

 public class BackThreadCaller
{ private static volatile BackThreadCaller instance;
private ThreadPoolExecutor pool;
private static Logger log = LoggerFactory.getLogger(BackThreadCaller.class); private BackThreadCaller()
{
int corePoolSize = CalendarConsts.getThreadCorePoolSize();
int maximumPoolSize = CalendarConsts.getThreadMaximumPoolSize();
int keepAliveTime = CalendarConsts.getThreadKeepAliveTime();
int QueueSize = CalendarConsts.getThreadQueueSize();
pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(QueueSize),
new ThreadPoolExecutor.DiscardPolicy());
} public static BackThreadCaller getInstance()
{
if (instance == null)
{
synchronized (BackThreadCaller.class)
{
if (instance == null)
{
instance = new BackThreadCaller();
}
}
}
log.info("BackThreadCaller:ActiveCount={}|CompletedTaskCount={}|CorePoolSize={}|LargestPoolSize={}|PoolSize={}|TaskCount={}",
instance.getActiveCount(),instance.getCompletedTaskCount(),
instance.getCorePoolSize(),instance.getLargestPoolSize(),instance.getPoolSize(),
instance.getTaskCount());
return instance;
} public void startAThread(Thread thread)
{
try
{
pool.execute(thread);
}
catch (Exception e)
{
log.error("Exception", e);
}
} /**
* 开始执行一个线程
* @param thread
*/
public void startAThread(Runnable thread)
{
try
{
pool.execute(thread);
}
catch (Exception e)
{
log.error("Exception", e);
}
} // 正在执行的线程任务数,本例中如果为2,则可以观察两个office是否可以同时工作
public int getActiveCount()
{
return pool.getActiveCount();
} // 返回池中的当前线程数
public int getPoolSize()
{
return pool.getPoolSize();
} // 返回核心线程数
public int getCorePoolSize()
{
return pool.getCorePoolSize();
} // 返回曾经同时位于池中的最大线程数
public int getLargestPoolSize()
{
return pool.getLargestPoolSize();
} // 已经完成的任务总数
public long getCompletedTaskCount()
{
return pool.getCompletedTaskCount();
} // 曾经计划的任务总数
public long getTaskCount()
{
return pool.getTaskCount();
} }

调用线程池对象

 public void setTaskMessages(final CalendarBean calendarBean)
{
BackThreadCaller.getInstance().startAThread(new Runnable(){
public void run(){
//业务处理
}
});
}

b、写日志

使用单例生成唯一一个日志处理类,同一时间保证一条日志写入队列

3、简单工厂模式

凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。例如QueueConnectionFactoryMQ连接工厂,UserLogFactory日志处理类工厂,天气预报数据源提供者工厂

 public class UserLogFactory
{
public static UserLog create(String userLogType)
{
if(Contants.Log.USER_CLICK_LOG_TYPE.equals(userLogType))
{
return new ClickLog();
}
else if(Contants.Log.USER_ACTION_LOG_TYPE.equals(userLogType))
{
return new ActionLog();
}
return null;
}
}

4、观察者模式(发布订阅者模式)

统一配置中用到,维持一个tcp长链接进行一个数据的推送,服务端有个保活的功能,每隔两个小时对客户端发起询问

5、装饰者模式

输入输出流

6、责任链模式

tomcat责任链

浅谈JAVA设计模式的更多相关文章

  1. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  2. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  3. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  4. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  5. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  6. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  7. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

  8. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  9. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

随机推荐

  1. xcode配置绝对路径与相对路径

     一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径 ...

  2. win7系统中如何使文件显示出扩展名

    win7系统中如何使文件显示出扩展名-------------------- 1.点击计算机-->>点击组织,然后选择"文件夹及搜索选项"-->> ---- ...

  3. infragistics-webdatagrid

    infragistics-webdatagrid DataRow DataTable DataSet DataColumn stringBuilder append appendFormat 存储过程 ...

  4. yield和send的执行循序彻底搞清

    yield: 对于yield方法和Generator的send同时使用时的执行顺序一直搞不清,今天看到这篇 理解PHP中的Generator 加上测试,终于搞清了. 总结一下上文中的结论: Gener ...

  5. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

  6. AngularJS 技术总结

    学习AngularJS,并且能在工作中使用到,算是很幸运了.因此本篇也会搜集各种资料,进行分享. 书籍分享 AngularJS权威指南 常用链接 AngularJS API文档 AngularJS 用 ...

  7. Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()

    函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...

  8. Go - 变量初始化 及 注意事项

    Go变量 初始化 对 复合类型(数组.切片.字典.结构体)变量的初始化是,有一些语法限制: 1.初始化表达式必须包含类型标签: 2.左花括号必须在类型尾部,不能另起一行: 3.多个成员初始值以逗号分隔 ...

  9. MySQL 事物控制和锁定语句

    一.MySQL支持对MyISAM和MEMORY存储引擎的表进行表级锁定,对InnoDB存储引擎的表进行行集锁定.默认情况下是自动获得. 二.LOCK TABLES 可以用于锁定当前线程获得的表,如果表 ...

  10. 1.reset.css的设置

    /* reset css */ *, ::before, ::after{ /*选择所有的标签 */ margin: 0; padding: 0; /*清除移动端默认的 点击高亮效果*/ -webki ...