在开发系统中,常常会碰到一个问题。如今须要实现的一些功能,可是这个功能模块之后必定是须要扩展的,那么如今开发中就不只要实现如今的功能,还要考虑之后的扩展。那么为了系统的健壮,扩展就要遵循开闭原则(简单说,就是对修改关闭,对扩展开发)。设计模式
要实现这个功能,就是要找到一种方法。能够建立一些操做,可是如今不实现,等着之后来实现这个功能。框架
如今经过一我的成长过程当中学到的技能来展现一下这种方案:ide
在社会中生存技能千千万万,人也是在不断学习技能的,可是都能学习到那些技能本身也不能肯定。可是学习技能是必定的。这时候咱们就先定义一个技能的类,可是不知道学习的是什么技能,因此就先实现一个技能接口。学习
package designPattern_3_FactoryMethod; //技能接口 public interface ILifeKills { public void kill(); }
学习的过程不要和技能耦合在一块儿,须要单独对象来实现,学习的过程就是建立技能对象的过程,因此这个学习对象就是用来生成具体的技能对象的。可是若是是一我的生学习技能方面的框架的话,确定也不知道学习的是什么技能,那这就是自相矛盾了。怎么办呢?既然是框架,确定有人来具体实现这个须要学习的技能和具体的学习方式。因此这个咱们就知识定义学习方法,可是不定义学习的具体内容,让使用框架的人来实现。这就是定义一个抽象类。spa
package designPattern_3_FactoryMethod; //抽象学习方法 public abstract class AbstractLearn { public void learn(){ ILifeKills lifekill = factoryMethod();
lifekill.kill(); } protected abstract ILifeKills factoryMethod(); }
下面列出交流、开车的技能设计
1 package designPattern_3_FactoryMethod; 2 //交流技能 3 public class Talking implements ILifeKills { 4 public void kill(){ 5 System.out.println("交谈技能"); 6 } 7 }
package designPattern_3_FactoryMethod; //开车技术 public class Driver implements ILifeKills { @Override public void kill() { // TODO Auto-generated method stub System.out.println("开车技术!"); } }
具体学习的方法code
package designPattern_3_FactoryMethod; //学习交流的对象 public class LearnTalking extends AbstractLearn { public ILifeKills learn(){ return new Talking(); } }
package designPattern_3_FactoryMethod; //学习开车 public class LearnDriver extends AbstractLearn { @Override protected ILifeKills factoryMethod() { // TODO Auto-generated method stub return new Driver(); } }
客户端调用对象
1 package designPattern_3_FactoryMethod; 2 3 public class Client { 4 5 public static void main(String[] args) { 6 AbstractLearn al = new LearnTalking(); 7 al.learn(); 8 AbstractLearn al2 = new LearnDriver(); 9 al2.learn(); 10 } 11 }
这面展现的例子就是工厂方法模式。只是我只生产一个具体的对象。之后根据须要能够生成对应的技能对象。接下来先看下工厂模式的定义,再结合简单工厂模式分析。结构图blog
定义一个建立产品对象的工厂接口,将实际建立工做推迟到子类当中。核心工厂类再也不负责产品的建立,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可使系统在不修改具体工厂角色的状况下引进新的产品。接口
工厂方法的意义,在父类不知道须要生产具体对象的状况下,可以完成自身的功能调用,具体的实现延迟到其子类,实际上就是工厂类也抽象化了,具体的对象在各自的工厂子类中来实现。
经过定义能够看出:抽象出来具体对象的接口,同时把工厂类也抽象化,这样产品对象和具体工厂都实现各自的抽象类,之后在扩展具体的对象的时候不用修改原来的工厂类,这也更加符合开闭原则。同时也看出来了,工厂方法模式是简单工厂模式的衍生。若是把工厂类的抽象类省略到,用普通类选择实现,那么工厂方法模式就回来到简单工厂模式。
在使用工厂方法的时候要具备灵活性,在一个具体的工厂功法里面能够有多个不一样的工厂方法,也能够在一个工厂类中实现十分相近的产品。看着有点相似简单工厂了,可是本质上仍是工厂方法的本质。只是形式有些变化而已,可是这不重要。就像学习武功,只要内功深厚,不少招式都可以灵活运用,看似神奇,其实都是内功支撑。而设计模式也是如此。工厂方法模式只要把具体对象的实现延迟到子类,之后扩展工厂时候不用再去修改原来的工厂类,符合了开闭原则。那么就抓住了工厂方法模式的本质。
分析了这么多工厂模式的优势,它固然也有缺点。就是会加大代码的复杂度,若是在不合适的场景中用到颇有可能得不偿失。
工厂方法的本质:就是把对象的实现延迟到其子类来实现,使得对产品的扩展更加灵活。这也是工厂方法模式和简单公共的区别。
工厂方法不是不能够选择实现。以个人理解,在一个具体的工厂类中,能够实现相近的产品。之后扩展的时候再派生另外的类就能够了。
下一篇分析抽象工厂模式