当你第一次听说设计模式的时候可能会觉得这有什么用呢,但当你有了一定的工作经历之后,就会发现缺乏设计模式,代码真的会写的一团糟,接下来我会按照 小博哥的《重学JAVA设计模式》为主记录下我的设计模式学习过程。传送门:小博哥的博客
一、工厂方法模式
工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类 决定实例化对象的类型。
这种设计模式也是Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子
类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的 只是知道调用即可,同时,这也是去掉众多ifelse的方式。当然这可能也有一些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。
实例中是有个一个活动有三种奖品类型,每种奖品的具体方法逻辑比一样,常规的写法是在一个方法体中根据奖品类型if else 一个个判断,然后将具体的逻辑写在对应的if逻辑中
// 1:消费卡、2:实物、3:积分
if(type == 1){
/*发放消费卡逻辑*/
}else if(type ==2){
/*发放实物逻辑*/
}else if(type == 3){
/*发放积分逻辑*/
}
后续如果要再增加奖品类型则再增加一个else if,这种方式比较简单粗暴,由于在示例中没有写具体的逻辑,所以看起来还很清晰明了,但是实际情况下加上一堆的具体逻辑后,在维护的时候再想分清楚谁是谁就有点费劲了;
使用设计模式的思想该怎么做呢?我们可以提取出一个父类,然后每一种奖品的操作逻辑提取为一个子类,通过传入类型,由父类创建具体的子类对象;
//公共父类
public interface ICommodityService{
void sendCommodity(String uid, String commodityId, String bizId, Map<String, String> extMap);
}
优惠券
public class CouponCommodityService implements ICommodityService{
public void sendCommodity(String uid, String commodityId, String bizId, Map<String, String> extMap){
/**/
}
实物
public class GoodsCommodityService implements ICommodityService{
public void sendCommodity(String uid, String commodityId, String bizId, Map<String, String> extMap){
/**/
}
积分
public class ScoreCommodityService implements ICommodityService{
public void sendCommodity(String uid, String commodityId, String bizId, Map<String, String> extMap){
/**/
}
工厂类
public class StoreFactory{
public ICommodityService getCommodityService(int type){
if(type == 1){
return new CouponCommodityService();
}
if(type == 2){
return new GoodsCommodityService();
}
if(type == 3){
return new ScoreCommodityService();
}
}
}
最终的调用方法
StoreFactory storeFactory = new StoreFactory();
ICommodityService commodityService = storeFactory.get(type);
// 发放奖品
commodityService.sendCommodity();
确实整体的复杂度增加了,但局部的逻辑就比较清晰明了了。后续增加新的奖品时只需要增加一个新的类并放入工厂类中即可,调用方可以不改动代码和关心具体的实现