设计模式四之工厂方法模式

通过理论,代码示例,Android源码来学习工厂方法模式

介绍

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

定义

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

使用场景

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

工厂模式代码示例

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

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

1
2
3
4
5
6
7
8
9
public abstract class IModule {

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

具体功能的实现类

1
2
3
4
5
6
7
public class PlayMusicImpl implements IFunctionModule {
private String TAG = getClass().getSimpleName();
@Override
public void function() {
Log.i(TAG,"播放音乐");
}
}
1
2
3
4
5
6
7
8
9
10
public class PlayVideoImpl implements IFunctionModule {


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

@Override
public void function() {
Log.i(TAG,"播放视频");
}
}
1
2
3
4
5
6
7
8
9
10
public class NewsImpl implements IFunctionModule {

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

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

}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}
}
}

使用:

1
2
3
4
5
6
7
8
9
10
@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());

}

输出:

1
2
VIP:3
KIP:2

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

总结

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

坚持原创技术分享,您的支持将鼓励我继续创作!