定义:
工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继承它的子类去完成。当我们的系统需要增加其他新的对象时,我们只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何修改,这样很好地符合了“开闭原则”。
示例代码:
Fruit.java
package com.designPattern.factoryMethod; /*** * * @author liuzhihu * */ public interface Fruit { /*** * 定义吃水果的方法 */ public void eatFruit(); }
Apple.java
package com.designPattern.factoryMethod; /*** * * @author liuzhihu * */ public class Apple implements Fruit { @Override public void eatFruit() { System.out.println("吃苹果 ......"); } }
Banana.java
package com.designPattern.factoryMethod; /*** * * @author liuzhihu * */ public class Banana implements Fruit { @Override public void eatFruit() { System.out.println("吃香蕉 ......"); } }
FruitFactory.java
package com.designPattern.factoryMethod; public abstract class FruitFactory { /*** * 采集水果 * * @param type * @return */ public abstract Fruit getFruit(); }
AppleFactory.java
package com.designPattern.factoryMethod; public class AppleFactory extends FruitFactory { @Override public Fruit getFruit() { System.out.println("采摘苹果"); return new Apple(); } }
BananaFactory.java
package com.designPattern.factoryMethod; public class BananaFactory extends FruitFactory { @Override public Fruit getFruit() { System.out.println("采摘香蕉"); return new Banana(); } }
MainTest.java
package com.designPattern.factoryMethod; /*** * 工厂方法模式 * * @author liuzhihu * */ public class MainTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { AppleFactory appleFactory = new AppleFactory(); Fruit apple = appleFactory.getFruit(); apple.eatFruit(); BananaFactory bananaFactory = new BananaFactory(); Fruit banana = bananaFactory.getFruit(); banana.eatFruit(); } }
以上代码,如果想要再添加一种水果,那么实现一下Fruit.java与FruitFactory.java 即可,不用再重新修改旧的代码!
优点
1、 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。
2、 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点
1、 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。