在以前的文章里面讲述过简单工厂模式,见链接:http://www.cnblogs.com/zhuxiansheng/p/7873161.html
简单工厂模式解耦了客户端和实现的依赖,不过如果有再次扩展实现的话,我们不得不去修改工厂当中的选择分支,来添加case,然后添加新的实现,这违背了开放-关闭原则。如何解决这个问题,工厂模式给了很好的解答。
大话设计模式-类图
大话设计模式中的例子代码如下:
/**
* 工厂接口
*/
public interface IFactory { public LeiFeng createLeiFeng();
}
/**
* 父类
*/
public class LeiFeng { public void sweep() {
System.out.println("扫地");
} public void buyRice() {
System.out.println("买米");
} public void wash() {
System.out.println("洗碗");
}
}
/**
* 子类
*/
public class Undergraduate extends LeiFeng{ }
/**
* 子类
*/
public class Volunteer extends LeiFeng{ }
/**
* 志愿者工厂
*/
public class UndergraduteFactory implements IFactory{ @Override
public LeiFeng createLeiFeng() {
return new Undergraduate();
} }
/**
* 大学生工厂
*/
public class VolunteerFactory implements IFactory{ @Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
/**
* 客户端
*/
public class Test { public static void main(String[] args) {
IFactory volunteerFactory = new VolunteerFactory();
LeiFeng leiFeng = volunteerFactory.createLeiFeng();
leiFeng.sweep();
leiFeng.buyRice();
leiFeng.wash();
}
}
如果在添加别的角色,我们只需要添加对应的工厂和角色domain就可以实现在不修改原代码同时添加新的实现,针对工厂符合了开放-关闭原则,不过针对客户端我们还是要修改创建哪个具体工厂的代码。
回想一下简单工厂模式,如果我们在扩展M的N次方时,我们只需要实现计算工厂接口,然后在添加具体的计算类,就实现了实现的扩展,这是笔者对简单工厂和工厂模式的理解,希望能帮助学习工厂模式的童鞋!