浅谈JAVA设计模式

时间:2023-03-08 16:51:03
浅谈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责任链