介绍
工厂模式 ( 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 ,外部可以通过不同的权限来组装对应的业务功能。也就实现了这个需求。
总结
总的来说,工厂方法模式是一个很好的设计模式,但是也有缺点,每次我们为工厂方法模式添加一个新的模块都要编写新的模块类,同时引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否使用工厂模式,需要自己权衡利弊了。