1. 工厂模式

原创
2021/08/21 17:35
阅读数 23

[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. 优点:
  1. 避免了创建者和具体的产品耦合在一起
  2. 每一个业务逻辑都在自己的实现类中
  3. 满足开闭原则,无须更改使用放就可以随意新增产品类型
2.不足:
  1. 当产品类型非常多的时候,实现的子类将会变得非常多
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部