全部博文(164)
分类: 系统运维
2012-05-07 15:38:21
简单工厂的缺点
上面我们谈了简单工厂的优点和扩展。下面我们来看看简单工厂的缺点。有一个被认为最不好的缺点,就是不符合OCP原则。也就是说,当你增加一个新类时,你必须修改工厂方法,添加一段处理代码。这不符合,已有代码尽可能不改变的原则。于是工厂方法模式应运而生了。
工厂方法模式的优点
既然上面简单工厂的缺点是不能够做到OCP,那么工厂方法的优点就是满足OCP原则。
工厂方法模式的实现
一个简单的例子是一个体育组织。假设有一个体育协会,协会记录所有的运动员,篮球的前锋、中锋和后卫;足球的前锋、中锋和后卫。如果组织里的人不太多,那无疑的,简单工厂就可以满足了。但是会员越来越多,后来就划分成多个协会:足球协会、篮球协会、乒乓球协会等等。这样相当于有很多个小工厂了。如果原来使用简单工厂,就直接根据变量决定返回何种运动员子类。现在使用工厂方法,我们来实现一下。
运动员.java
public interface 运动员 {
public void 跑();
public void 跳();
}
足球运动员.java
public class 足球运动员 implements 运动员 {
public void 跑(){
//跑啊跑
}
public void 跳(){
//跳啊跳
}
}
篮球运动员.java
public class 篮球运动员 implements 运动员 {
public void 跑(){
//do nothing
}
public void 跳(){
//do nothing
}
}
体育协会.java
public interface 体育协会 {
public 运动员 注册();
}
足球协会.java
public class 足球协会 implements 体育协会 {
public 运动员 注册(){
return new 足球运动员();
}
}
篮球协会.java
public class 篮球协会 implements 体育协会 {
public 运动员 注册(){
return new 篮球运动员();
}
}
俱乐部.java
public class 俱乐部 {
private 运动员 守门员;
private 运动员 后卫;
private 运动员 前锋;
public void test() {
体育协会 中国足协 = new 足球协会();
this.前锋 = 中国足协.注册();
this.后卫 = 中国足协.注册();
前锋.跑();
后卫.跳();
}
}
上面的实现过程一定要关注到一件事,就是所有的工厂返回的对象都必须是运动员,也就是抽象工厂接口中定义的返回类型。上面的处理,在以后需要增加乒乓球协会时只需要添加下面的具体工厂类和具体的乒乓球运动员类。原代码无需改变。于是满足了OCP的原则。
乒乓球协会.java
public class 乒乓球协会 implements 体育协会 {
public 运动员 注册(){
return new 乒乓球运动员();
}
}
除了上面说的这些之外,我们还可以把各个协会的具体实现做成简单工厂方式的。这样如果只剩一个工厂时就退化成简单工厂了。
工厂方法的缺点
工厂方法的缺点主要是结构复杂,代码量比较大,非静态调用。如果你使用简单工厂可以满足需要,就直接使用简单工厂吧!