在以前的文章里面讲述过简单工厂模式,见链接: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次方时,我们只需要实现计算工厂接口,然后在添加具体的计算类,就实现了实现的扩展,这是笔者对简单工厂和工厂模式的理解,希望能帮助学习工厂模式的童鞋!