简单工厂模式又叫静态工厂方法(Static Factory Method)模式。简单工厂模式主要是解决对象的创建问题,被创建的类通常都有相同的父类。
在家的时候爸爸妈妈都喜欢看电视,爸爸关注新闻频道,妈妈要看时装频道。写成代码就是如下形式:
- 新闻频道类
public class News {
public void watch() {
System.out.print("watch news");
}
}
- 时装频道类
public class Fashion {
public void watch() {
System.out.print("watch fashion");
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
String person = "father";
switch (person) {
case "father" :
News news = new News();
news.watch();
break;
case "mather" :
Fashion fashion = new Fashion();
fashion.watch();
break;
}
}
}
放学后,儿子回来了,儿子最爱看卡通片了。进行如下修改:
- 卡通频道类
public class Cartoon {
public void watch() {
System.out.print("watch cartoon");
}
}
加了卡通频道这个类后发现还不行,还要让客户端知道儿子要看卡通片,于是再进行修改:
- 客户端测试类
public class Client {
public static void main(String[] args) {
String person = "father";
switch (person) {
case "father" :
News news = new News();
news.watch();
break;
case "mather" :
Fashion fashion = new Fashion();
fashion.watch();
break;
case "child" :
Cartoon cartoon = new Cartoon();
cartoon.watch();
break;
}
}
}
除夕夜外婆来了,外婆喜欢看小品...发现还得修改客户端类,这就造成了很大的不便,来一个人就要修改客户端类,那么,我们能不能做到即使家里来了客人,客户端类也不做任何改动呢?
简单工厂模式可以改善这个问题,简单工厂模式的核心思想就是用一个单独的类来创建类的实例,对调用方来说,只需要知道工厂类以及各对象的基类就可以了。
首先提取出一个频道接口,拥有观看这个方法,新闻频道、时装频道、卡通频道均实现继承频道接口,UML类图如下:
- 频道接口
public interface Channel {
void watch();
}
- 新闻频道类
public class News implements Channel {
@Override
public void watch() {
System.out.print("watch news");
}
}
- 时装频道类
public class Fashion implements Channel{
@Override
public void watch() {
System.out.print("watch fashion");
}
}
- 卡通频道类
public class Cartoon implements Channel {
@Override
public void watch() {
System.out.print("watch cartoon");
}
}
我们将实例化新闻频道等各个频道的功能集成在一个工厂类里,只需要输入相应的人,就能实例化出相应的频道。
- 频道工厂类
public class ChannelFactory {
public static Channel createChannel(String person) {
Channel channel = null;
switch (person) {
case "father" :
channel = new News();
break;
case "mather" :
channel = new Fashion();
break;
case "child" :
channel = new Cartoon();
break;
}
return channel;
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
Channel channel = ChannelFactory.createChannel("child");
channel.watch();
}
}
运行结果:
watch cartoon
现在,不管谁来了,我们只需要加一个频道实现,并且修改一下工厂类就行,并不需要修改客户端类了,也就是不需要修改调用方了。
简单工厂模式的核心在于工厂类,用户给出指定的信息,就可以获得一个他想要的实例,而并不需要知道实例在内部是如何创建出来的,对软件体系结构具有优化作用。
但由于所有实例的创建逻辑都集中在工厂类中,新加一个类就得修改工厂类,所以它违反了高内聚的责任分配原则。