浅谈JAVA设计模式
没有万行的代码量,就不要想搞清楚设计模式。目前本人代码量大约在六千五百行,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设计模式的更多相关文章
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 浅谈java性能分析
浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
随机推荐
- 非对称加密算法——RSA
RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和L ...
- 常用的网络命令--之...... Ipconfig详解
ipconfig是运行微软的Windows9x/NT/2000/XP/Vista操作系统的电脑上用来控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过/ ...
- 30个要点帮你完成java代码优化
通过java代码规范来优化程序,优化内存使用情况,防止内存泄露 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容 ...
- linux下的apache配置文件详解
.Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 站点的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/s ...
- visio二次开发——图纸解析之线段
多写博客,其实还是蛮好的习惯的,当初大学的时候导师就叫我写,但是就是懒,大学的时候,谁不是魔兽或者LOL呢,是吧,哈哈哈. 好了,接着上一篇visio二次开发——图纸解析,我继续写. 摘要: (转发请 ...
- SSAS动态添加分区(一)
一.动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验 ...
- Mac Pro 资源管理器 Double Commander“个性化设置” 备份
操作系统自带的资源管理器,总是有些别扭的地方,在 Windows 系统下,我一般用 Total Commander(破解版)来作为替代品.现在换为 Mac 系统,自带的 Finer 也不怎么好用,连最 ...
- MySQL 关联表批量修改(数据同步)
update table1 t1 ,table2 t2 set t1.field1 = t2.field2 where t1.id = t2.id
- Shell入门教程:流程控制(7)break和continue
第一节:breank命令 4种循环 for.while.until.select,如果想要提早结束循环,可在循环中使用break命令.执行break时,会跳出一层的循环,如果想跳出多层循环,可在bre ...
- StartUML反向(逆向)Java工程通过代码生成类图
在软件工程中,通过都是先了详细设计,然后按照详细设计来进行开发.在编写详细设计的时候,通常都会画一些类图.时序图.流程图等等UML设计,然后通过uml类图生成代码,这个属于正向工程生成代码,然而在实 ...