浅谈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基础的时候,有些知识点是非常重要 ...
随机推荐
- C# byte[]、struct、intptr等的相互转换
1.struct byte[]互相转换 //struct转换为byte[] public static byte[] StructToBytes(object structObj) { int siz ...
- 再谈vim中多窗口的编辑
参考:http://blog.csdn.net/shuangde800/article/details/11430659 很好 鼠标在各个窗口间循环移动: ctrl+w+(小写的 hjkl), &qu ...
- codevs1021 玛丽卡
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- 如何设置phpMyAdmin自动登录和取消自动登录
如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件,则直 ...
- 【Alpha版本】冲刺-Day1
队伍:606notconnected 会议时间:11月9日 会议总结 张斯巍(433) 今天安排:设计登陆界面背景,图标的大小规定 完成度:90% 明天计划:主界面图标的修改,侧边栏背景设计,个人信息 ...
- ReactiveCocoa源码拆分解析(六)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...
- 按Enter键执行表单验证
document.onkeydown = function(evt){ var evt = window.event?window.event:evt; if (evt.keyCode==13) { ...
- getComputedStyle的简单用法
var number=window.getComputedStyle("元素").style样式名
- Koa2 的安装运行记录(一)
1.参考koa+react(一) http://blog.suzper.com/2016/10/19/koa-react-%E4%B8%80/ 为了使用 KOA2 能够运行,必须能够使用ES7语法 a ...
- PHP 函数(数组字符串)
函数四要素: 参数 变量 返回值 函数体 函数分类: 1.有参数的函数: function Show() { echo "hello"; } Show(); 2. 有返回 ...