定义:
工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继承它的子类去完成。当我们的系统需要增加其他新的对象时,我们只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何修改,这样很好地符合了“开闭原则”。
示例代码:
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、 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
浙公网安备 33010602011771号