静态工厂模式与策略模式的比较
静态工厂模式:一般采用if…else语句或switch语句通过条件判断,并返回结果。这样写起来是比较方便的,适用于不复杂的类,但是该模式耦合程度比较高。
策略模式:通过由实现类实现行为接口,在操作类中切换不同实现类的行为。这样写起来比较解耦,但是会导致类增多。适用于行为比较复杂的类。
接下来看下实例代码:
静态工厂模式:
public class DateUtils {
public enum Mode {
MODE1, MODE2, MODE3, MODE4, MODE5
}
public static String getDataFormat(Mode m, @NonNull Date d) {
String date = "";
switch (m) {
case MODE1:
date = mode1(d);
break;
case MODE2:
date = mode2(d);
break;
case MODE3:
date = mode3(d);
break;
case MODE4:
date = mode4(d);
break;
case MODE5:
default:
SimpleDateFormat format = new SimpleDateFormat();
date = format.format(d);
break;
}
return date;
}
private static String mode1(@NonNull Date d) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:SS");
return format.format(d);
}
private static String mode2(@NonNull Date d) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm");
return format.format(d);
}
private static String mode3(@NonNull Date d) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd");
return format.format(d);
}
private static String mode4(@NonNull Date d) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
return year + "/" + month + "/" + day;
}
}
程序入口:
Log.e("zhang", "onCreate--> " + DateUtils.getDataFormat(DateUtils.Mode.MODE3, new Date()));
Log.e("zhang", "onCreate--> " + DateUtils.getDataFormat(DateUtils.Mode.MODE4, new Date()));
策略模式
行为的接口:
public interface Format {
String date(Date date);
}
行为的实现类(这里采用比较简单的实现):
public class DateFormat implements Format {
@Override
public String date(@NonNull Date d) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd");
return format.format(d);
}
}
public class TimeFormat implements Format {
@Override
public String date(@NonNull Date d) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
return year + "/" + month + "/" + day;
}
}
行为的管理类(控制类):
public class DateManager {
private Format state;
public void setState(Format state) {
this.state = state;
}
public String date(@NonNull Date date){
return state.date(date);
}
}
程序入口:
DateManager d = new DateManager();
d.setState(new DateFormat());
String date = d.date(new Date());
Log.e("zhang", "onCreate--> date===" + date);
d.setState(new TimeFormat());
date = d.date(new Date());
Log.e("zhang", "onCreate--> date===" + date);
上述例子可以对比看出,如果方法的实现不是很复杂,使用静态工厂模式实现是比较方便的,只需要一个类就搞定。如果方法的实现非常复杂,超过几百行代码,那么就需要考虑策略模式了。