前段时间看了下设计模式的工厂模式,结合手头上的工作,直接用工厂模式优化了下,直观感受就是直接的提升了工作的效率,不多说直接上代码。
#!/usr/local/bin/python
# coding=utf-8
'''
A new time factory for processing stat time
'''
import sys
import time
import datetime
(STAT_HOURLY, STAT_DAILY, STAT_WEEKLY, STAT_MONTHLY, STAT_MINUTE) = range(5)
STAT_PERIODS = {
'HOURLY': STAT_HOURLY,
'DAILY': STAT_DAILY,
'WEEKLY': STAT_WEEKLY,
'MONTHLY': STAT_MONTHLY,
'MINUTE': STAT_MINUTE,
}
#时间初始工厂
class TimeFactory(object):
def __init__(self,start_time,end_time,diff=None):
self.start_time = start_time
self.end_time = end_time
self.diff = diff
def process_time(self):
pass
#公用方法,用于返回时间区间的列表,在工厂控制2函数处调用
def time_range(self):
time_list = []
date_list = self.process_time()
print(date_list)
for i,time in enumerate(date_list):
if i < len(date_list)-1:
time = [date_list[i],date_list[i+1]]
time_list.append(time)
return time_list
#处理日统计工厂
class dayFactory(TimeFactory):
def process_time(self):
date_list = []
dt = self.start_time
delta = datetime.timedelta(days=1)
while dt <= self.end_time:
date_list.append(dt.strftime('%Y%m%d'))
dt += delta
date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
return date_list
#处理周统计工厂
class weekFactory(TimeFactory):
def process_time(self):
date_list = []
dt = self.start_time
dt -= datetime.timedelta(days=6)
delta = datetime.timedelta(days=1)
while dt <= self.end_time:
if dt.weekday() == 0:
date_list.append(dt.strftime('%Y%m%d'))
dt += delta
date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
return date_list
#处理月统计工厂
class monthFactory(TimeFactory):
def process_time(self):
dt = self.start_time
date_list = set()
delta = datetime.timedelta(days=1)
while dt <= self.end_time:
date_list.add('%s%s%s' % (dt.year, dt.month, 1))
dt += delta
date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
return date_list
#处理小时统计工厂
class hourFactory(TimeFactory):
def process_time(self):
hour_list = []
self.diff = 3600
# begin = int(time.mktime(datetime.datetime.strptime(self.start_time,'%Y-%m-%s').timetuple()))
begin = int(time.mktime(datetime.datetime.timetuple(self.start_time)))
end = int(time.mktime(datetime.datetime.timetuple(self.end_time)))
while begin <= end:
hour_list.append(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(begin)))
begin += 3600
return hour_list
#此类支持分钟和秒统计,传入diff为秒的差值,例按每分钟统计则传入diff=60
class otherFactory(TimeFactory):
def process_time(self):
hour_list = []
begin = int(time.mktime(datetime.datetime.timetuple(self.start_time)))
end = int(time.mktime(datetime.datetime.timetuple(self.end_time)))
while begin <= end:
hour_list.append(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(begin)))
begin += int(self.diff)
return hour_list
#控制时间工厂函数1和2的区别:返回时间格式不同,1返回统计时间列表,2返回统计时间区间列表
def control_TimeFactory(period,date_range,diff=None):
start_time = date_range.split('-')[0]
end_time = date_range.split('-')[1]
start_time = datetime.datetime.strptime(start_time, '%Y%m%d')
end_time = datetime.datetime.strptime(end_time, '%Y%m%d')
print(start_time, end_time)
if period == 1:
stat_timelist = dayFactory(start_time, end_time).process_time()
elif period == 2:
stat_timelist = weekFactory(start_time, end_time).process_time()
elif period == 3:
stat_timelist = monthFactory(start_time, end_time).process_time()
elif period == 4:
stat_timelist = hourFactory(start_time, end_time).process_time()
else:
stat_timelist = otherFactory(start_time, end_time, diff).process_time()
return stat_timelist
def control_TimeFactory2(period,date_range,diff=None):
start_time = date_range.split('-')[0]
end_time = date_range.split('-')[1]
start_time = datetime.datetime.strptime(start_time, '%Y%m%d')
end_time = datetime.datetime.strptime(end_time, '%Y%m%d')
print(start_time, end_time)
if period == 1:
stat_timelist = dayFactory(start_time, end_time).time_range()
elif period == 2:
stat_timelist = weekFactory(start_time, end_time).time_range()
elif period == 3:
stat_timelist = monthFactory(start_time, end_time).time_range()
elif period == 0:
stat_timelist = hourFactory(start_time, end_time).time_range()
else:
stat_timelist = otherFactory(start_time, end_time, diff).time_range()
return stat_timelist