静态工厂与策略模式的比较

来源:互联网 发布:视频录制软件哪个好 编辑:程序博客网 时间:2024/06/04 18:43

静态工厂模式与策略模式的比较

静态工厂模式:一般采用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);

上述例子可以对比看出,如果方法的实现不是很复杂,使用静态工厂模式实现是比较方便的,只需要一个类就搞定。如果方法的实现非常复杂,超过几百行代码,那么就需要考虑策略模式了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 六个月宝宝粘人爱哭怎么办 摔伤结巴里面灌脓了怎么办 两周半的宝宝说话结巴怎么办 孩子两周说话结巴怎么办 名字取了生僻字考大学怎么办 淘宝客服一直不说话怎么办 淘宝客服不说话也不发货怎么办 面对不说话的客人怎么办? 卖家客服不回复怎么办 2周小孩说话结巴怎么办 微信群里只领红包不说话的人怎么办 躺在微信不说话的客户怎么办 9岁儿童说话结巴怎么办 5岁儿童说话结巴怎么办 京东客服不说话怎么办 两岁宝宝说话有点结巴怎么办 孩子不敢跟外人说话怎么办? 孩子不爱跟外人说话怎么办 别人说我不说话怎么办 衣服屁股那块变亮怎么办 小孩家里说话外面不说话怎么办 2个月小宝宝便秘怎么办 3个月小宝宝便秘怎么办 微信客户不说话怎么办 一岁半宝宝便秘肛裂怎么办 网恋现在都不说话了怎么办 宝宝便秘四天了怎么办 月子里小孩吐奶怎么办 月子里的小孩吐奶怎么办 婴儿吃多了吐奶怎么办 20个月孩子便秘怎么办 一岁宝宝肛裂怎么办 婴儿吃饱了吐奶怎么办 23天新生儿吐奶怎么办 婴儿吐奶舌苔白怎么办 宝宝吐奶酸臭味怎么办? 1周岁吐奶有酸味怎么办 十多天的宝宝吐奶怎么办 未满月婴儿吐奶怎么办 2个月宝宝溢奶怎么办 四岁宝宝说话结巴怎么办