定义: 

工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继承它的子类去完成。当我们的系统需要增加其他新的对象时,我们只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何修改,这样很好地符合了“开闭原则”。

示例代码:

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、  每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  

 

posted on 2018-01-08 16:58  liuzhihu  阅读(198)  评论(0编辑  收藏  举报