[TOC]
1. 创建者模式之工厂方法模式
1. 简单定义
工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类提供了一种创建对象的方法,允许子类决定实例化对象的类型。 主要意图就是定义一个创建对象的接口,让其子类去决定实例化哪个类,工厂模式使其创建类的过程推迟到子类进行实例化进行创建。
2. 场景模式
对于互联网企业中,经常会给员工发放不同平台的优惠券,各个平台优惠券奖励的方式又不一样,对于这种业务需求,我们便可采取工厂方法实现我们的业务需求。
3. 工厂方法模式代码实现
1. 代码结构:
└── com
└── just
└── factory
├── StoreFactory.java
└── store
├── CouponsService.java
└── impl
├── JD.java
├── PDD.java
└── TAOBAO.java
2. 定义接口:
public interface CouponsService {
/**
* 返回获得的优惠信息,key:表示ID,value 表示物品
* @return
*/
public Map<String, String> getCoupons();
/**
* 平台类型
* @return
*/
public int getType();
}
3. 定义实现类:
-- 京东
public class JD implements CouponsService {
public Map<String, String> getCoupons() {
HashMap hashMap = new HashMap();
hashMap.put("1", "IKBC键盘");
hashMap.put("2", "OPPO蓝牙耳机");
hashMap.put("3", "OPPO蓝牙手表");
return hashMap;
}
public int getType() {
return 3;
}
}
-- 拼多多
public class PDD implements CouponsService {
public Map<String, String> getCoupons() {
HashMap hashMap = new HashMap();
hashMap.put("1","苹果手机");
hashMap.put("2","华为手机");
hashMap.put("3","小米手机");
return null;
}
public int getType() {
return 0;
}
}
-- 淘宝
public class TAOBAO implements CouponsService {
public Map<String, String> getCoupons() {
HashMap hashMap = new HashMap();
hashMap.put("1", "卫龙辣条");
hashMap.put("2", "大闸蟹");
hashMap.put("3", "湛江生蚝");
return hashMap;
}
public int getType() {
return 1;
}
}
4. 定义工厂:
public class StoreFactory {
public CouponsService getCouponsService(String name) {
if ("PDD".equals(name)) {
return new PDD();
}
if ("JD".equals(name)) {
return new JD();
}
if ("TAOBAO".equals(name)) {
return new TAOBAO();
}
return null;
}
public CouponsService getCouponsService(Class<? extends CouponsService> clazz) throws IllegalAccessException, InstantiationException {
if (clazz == null) return null;
return clazz.newInstance();
}
}
5. 测试用列:
public class FacoryTest {
@Test
public void testFactory() throws InstantiationException, IllegalAccessException {
StoreFactory storeFactory = new StoreFactory();
CouponsService couponsService = storeFactory.getCouponsService("JD");
System.out.println(couponsService.getCoupons());
CouponsService taobao= storeFactory.getCouponsService(TAOBAO.class);
System.out.println(taobao.getCoupons());
}
}
6. 输出结果:
{1=IKBC键盘, 2=OPPO蓝牙耳机, 3=OPPO蓝牙手表}
{1=卫龙辣条, 2=大闸蟹, 3=湛江生蚝}·1
4. 优点与不足
1. 优点:
- 避免了创建者和具体的产品耦合在一起
- 每一个业务逻辑都在自己的实现类中
- 满足开闭原则,无须更改使用放就可以随意新增产品类型
2.不足:
- 当产品类型非常多的时候,实现的子类将会变得非常多