上一篇我们学习了简单工厂方法,在写例子的时候我就在想在,工厂类怎么要写这么多的判断 - - !而且每增加一个新的产品,就要修改工厂模式,增加新的判断。
这么做违反了我们设计模式中的开闭原则。
今天就来学习下可以帮助我们消除这些判断的工厂方法模式。
定义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
接着我们就上代码:
1 //首先是我们的抽象工厂类 2 package com.java.FactorMethod; 3 4 public interface MobileFactory { 5 public Mobile createMobile(); 6 } 7 8 //然后是抽象产品类 9 package com.java.FactorMethod; 10 11 public interface Mobile { 12 public void makeCall(); 13 }
这里我们要做的是一个手机工厂生产手机的例子。先定义一个抽象工厂接口,然后再定义一个抽象手机接口。接口都是定义了职责。
1 //苹果工厂 2 package com.java.FactorMethod; 3 4 public class AppleFactory implements MobileFactory { 5 6 @Override 7 public Mobile createMobile() { 8 return new Iphone(); 9 } 10 11 } 12 //诺基亚工厂 13 package com.java.FactorMethod; 14 15 public class NokieFactory implements MobileFactory { 16 17 @Override 18 public Mobile createMobile() { 19 return new N83(); 20 } 21 22 }
以上就是两个具体的工厂类,他们的职责类似,但是创造的产品不同。
1 //iphone 2 package com.java.FactorMethod; 3 4 public class Iphone implements Mobile { 5 6 @Override 7 public void makeCall() { 8 System.out.println("苹果打电话"); 9 } 10 11 } 12 13 //诺基耶N83 14 package com.java.FactorMethod; 15 16 public class N83 implements Mobile { 17 18 @Override 19 public void makeCall() { 20 System.out.println("N83打电话"); 21 22 } 23 24 }
这两个就是具体的产品类(诺基亚N83.。。当年最爱的手机)
1 package com.java.FactorMethod; 2 3 public class Test { 4 public static void main(String[] args) { 5 MobileFactory factory=new NokieFactory(); 6 Mobile mobile = factory.createMobile(); 7 mobile.makeCall(); 8 } 9 }
这里可以看出,客户端决定生产哪个产品只需要创建产品对应的工厂即可。替我们省去了很多判断。
以上便是工厂方法模式。
有兴趣的可以看看大佬的博客深入理解:http://www.cnblogs.com/zuoxiaolong/p/pattern5.html