没有万行的代码量,就不要想搞清楚设计模式。目前本人代码量大约在六千五百行,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. Linux系统下压缩文件时过滤指定的文件 |Linux系统压缩指定文件代码

    进入要压缩的目录: [root@iZ25c748tjqZ wechat]# cd /alidata1/htdocs/wechat/ 查看目录: [root@iZ25c748tjqZ wechat]# ...

  2. 增加UBUNTU字符集 解决中文乱码问题

    对GBK,GB2312,GB18030字符集的支持是UBUNTU中文乱码的罪魁祸首,其实我们可以在保持UTF-8为默认编码的条件下添加对这几个编码的支持,以解决中文乱码问题. 我想这个问题肯定有其他人 ...

  3. c语言求数组长度

    在定义数组的函数内 int arr[] = {12.12}; int length; length = ]; 在别的函数中作为引用数据类型引入时,以上方法失效: 解决方法1:再传一个int 类型的长度 ...

  4. List拆分成多个集合

    如果对一组大的集合进行操作,想分组进行,比如批量新增10000条数据,想100条分成一个集合分成100个集合,对集合进行操作100次,用C#如何编写,这里记录下代码如下 //构造被分隔的集合 List ...

  5. C# 读取excel日期时获取到数字转换成日期

    string strDate= DateTime.FromOADate(Convert.ToInt32(data[i][7])).ToString("d"); strDate= D ...

  6. Python_DB_Api

    python DB API 内容 建立连接connection 数据库交互对象cursor 数据库异常类exception 流程 创建connection 获取cursor 执行查询.执行命令.获取数 ...

  7. 2013成都网络赛 C We Love MOE Girls(水题)

    We Love MOE Girls Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. 【强烈推荐】如何给TortoiseGit 配置密钥?

    TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.也就是说使用 ssh-keygen -C "username@email.com" - ...

  9. 用原生js实现的链式调用函数

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  10. C和指针 第十章 结构和联合 (一)

    结构体: 聚合数据类型是指,能够同时存储超过一个的单独数据,C语言中有两个聚合数据类型,数组和结构体.数组中储存的类型必须相同,元素通过下标和指针引用来访问的. 结构体也是一些值的集合,但是结构体中每 ...