设计模式 ( 四 ) 工厂方法模式

2,220 阅读2分钟

介绍

工厂模式 ( Factory Pattern ) ,是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次改模式了,如 Android 中的 Activity 里各个生命周期方法,以 onCreate 方法为例,它就可以看做是一个工厂方法,我们在其中可以构造我们的 View,并通过 setContentView 返回给 Framework 处理。

定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用 new 就可以完成创建的对象无需使用 Factory 。

工厂模式代码示例

需求:根据用户不同的权限,匹配不同的业务模块。

定义一个抽象的业务模块类

public abstract class IModule {

    /**
     * 根据不同的权限 拿到功能模块
     * @param permission
     * @return
     */
    public abstract List<IFunctionModule> getMoudleFun(String permission);
}

具体功能的实现类

public class PlayMusicImpl implements IFunctionModule {
    private String TAG = getClass().getSimpleName();
    @Override
    public void function() {
        Log.i(TAG,"播放音乐");
    }
}
public class PlayVideoImpl implements IFunctionModule {


    public  String TAG = getClass().getSimpleName();

    @Override
    public void function() {
        Log.i(TAG,"播放视频");
    }
}
public class NewsImpl implements IFunctionModule {

    private String TAG = getClass().getSimpleName();

    @Override
    public void function() {
        Log.i(TAG, "看新闻");

    }
}

具体功能模块工厂开始生产需要的模块

public class FunModuleFactor extends IModule {


    @Override
public List<IFunctionModule> getMoudleFun(String permission) {
    switch (permission) {
        case "VIP":
            List<IFunctionModule> vipLists = new ArrayList<>();
            vipLists.add(new PlayMusicImpl());
            vipLists.add(new PlayVideoImpl());
            vipLists.add(new NewsImpl());
          return vipLists;
         default:
           List<IFunctionModule> kipLists = new ArrayList<>();
           kipLists.add(new PlayMusicImpl());
           kipLists.add(new NewsImpl());
           return kipLists;
        }
    }
}

使用:

    @Test
    public void test7() {
        FunModuleFactor funModuleFactor = new FunModuleFactor();
        List<IFunctionModule> vip = funModuleFactor.getMoudleFun("VIP");
        System.out.println("VIP:" + vip.size());

        List<IFunctionModule> kip = funModuleFactor.getMoudleFun("KIP");
        System.out.println("KIP:" + kip.size());

    }

输出:

VIP:3
KIP:2

根据上面代码可知,我们定义了一个抽象模块类 IMoudle,FunModuleFactory 实现了 IModule ,外部可以通过不同的权限来组装对应的业务功能。也就实现了这个需求。

总结

总的来说,工厂方法模式是一个很好的设计模式,但是也有缺点,每次我们为工厂方法模式添加一个新的模块都要编写新的模块类,同时引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否使用工厂模式,需要自己权衡利弊了。

文章代码地址

特别感谢

《 Android 源码设计模式解析与实战 》