设计模式遵循六大设计原则:
- 单一职责原则(一个类和方法只做一件事)
- 里氏替换原则(多态,子类可扩展父类)
- 依赖倒置原则(细节依赖抽象、下层依赖上层)
- 接口隔离原则(建立单一接口)
- 迪米特原则(最少知道,降低耦合)
- 开闭原则(抽象架构、扩展实现)
- 工厂模式又称为工厂方法模式,是一种创建型设计模式。其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。
- 主要意图是定义一个创建一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
- 工厂模式使其创建过程延迟到子类进行。
- 提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。
- 示例:方法奖品
代码实现
-
定义发放奖品接口 ICommodity
/** * 定义发奖接口 * 统一管理入参 */ public interface ICommodity { /** * * 1、所有的奖品无论是实物、虚拟还是第三方,都需要通过程序实现此接口进行处理,以保证所有的入参的统一性 * @param uId 用户id * @param commondityId 奖品id * @param bizId 业务id * @param map 扩展:收获地址等 * @throws Exception */ void sendCommodity(String uId, String commondityId, String bizId, Map<String,String> map) throws Exception; }
-
定义商品发放服务
/** * 工厂里的组成部分之一 * 优惠券-实现奖品发放接口 */ public class CouponCommodityService implements ICommodity { private Logger logger = LoggerFactory.getLogger(CouponCommodityService.class); //模拟注入 private CouponService couponService = new CouponService(); /** * 重写发放奖品接口 * @param uId 用户id * @param commondityId 奖品id * @param bizId 业务id * @param map 扩展:收获地址等 * @throws Exception */ @Override public void sendCommodity(String uId, String commondityId, String bizId, Map<String, String> map) throws Exception { //调用服务进行发送 couponService.sendCoupon(uId,commondityId,bizId); // 对发放结果进行处理 System.out.println("发放完成给"+uId+"--"+commondityId); } }
-
定义商品工厂
/** * 定义商品工厂类 * 按照类型实例各种商品服务进行统一管理 */ public class StoreFactory { /** * 根据类型 提供相应的服务方法 * 所有服务方法实现同一接口 并同统一入参 规范管理化 * @param type * @return */ public ICommodity getCommodityService(Integer type) { if (null == type) { System.out.println("没有此商品发放服务"); return null; } else if (1 == type) { System.out.println("获取到优惠券发放服务"); return new CouponCommodityService(); } else if (2 == type) { System.out.println("会员卡发放服务"); return new CardCommodityService(); } // 异常问题 应throw出去 让调用者自己处理 return null; } }
@Test
public void testDesign01() throws Exception {
// 注入发放服务工厂 获取相应的发放服务进行发放
StoreFactory storeFactory = new StoreFactory();
storeFactory.getCommodityService(1).sendCommodity("1","1","3",null);
}
- 结果
总结
- 避免创建者与具体的产品逻辑耦合
- 满足单一职责,每一个业务实现都在所属自己的类中完成
- 满足开闭原则,无需更改使用调用方 就可以在程序中引入新的产品类型。
- 但是商品众多的情况下,子类会极速扩张,因此需要与其他设计模式结合进行优化。