文章目录
- 1. 概念
- 2. 实际的应用
1. 概念
FactoryMethod 模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。 FactoryMethod 解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
听不懂是吧?下面直接举例说明:
2. 实际的应用

 注:图中原作者出现笔误,BMW错拼成了BWM
 上图中①是BMW的产品接口,②是产品工厂的接口。
代码实现:
 (1)开发人员A的工作
 接口BMW.java:
package day09;
/**
 * 宝马车的产品接口
 * @author 14532
 *
 */
public interface BMW {
	//产品的信息介绍
	//车的发动方式
	void showInfo();
}
/**
 * 构建具体的车的类
 * @author 14532
 *
 */
class BMW3 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马3系车");
	}
}
class BMW5 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马5系车");	
	}
}
class BMW7 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马7系车");		
	}
}
接口BMWFactory.java:
package day09;
/**
 * 汽车生产工厂接口
 * @author 14532
 *
 */
public interface BMWFactory {
	BMW productBMW();
}
/**
 * 实现具体的车型的生产工厂
 * @author 14532
 *
 */
class BMW3Factory implements BMWFactory{
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马3系车");
		return new BMW3();
	}
}
class BMW5Factory implements BMWFactory{
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马5系车");
		return new BMW5();
	}
}
class BMW7Factory implements BMWFactory{
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马7系车");
		return new BMW7();
	}
}
(2)开发人员B的工作:
 Test.java:
package day09;
public class Test2 {
	public static void main(String[] args) {
		//这是开发人员B的工作
		BMW b3 = new BMW3Factory().productBMW();
		b3.showInfo();
		
		BMW b5 = new BMW5Factory().productBMW();
		b5.showInfo();
		
		BMW b7 = new BMW7Factory().productBMW();
		b7.showInfo();
	}
}
运行结果:
 
如果现在需要对宝马3系的车进行改造,改成宝马3i,该如何实现:
 BMW.java中class BMW3 implements BMW{改成class BMW3i implements BMW{
 BMWFactory.java中return new BMW3();改成return new BMW3i();
 为了区别改造的,在类BMW3Factory中添加一段输出System.out.println("改造3系车,定名为BMW3i型号");
 更改后的代码:
(1)开发人员A的工作产生了变化:
 接口BMW.java:
package day09;
/**
 * 宝马车的产品接口
 * @author 14532
 *
 */
public interface BMW {
	//产品的信息介绍
	//车的发动方式
	void showInfo();
}
/**
 * 构建具体的车的类
 * @author 14532
 *
 */
class BMW3i implements BMW{//更改为BMW3i
	@Override
	public void showInfo() {
		System.out.println("这个是宝马3系车");
		
	}
}
class BMW5 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马5系车");
		
	}
}
class BMW7 implements BMW{
	@Override
	public void showInfo() {
		System.out.println("这个是宝马7系车");
		
	}
}
接口BMWFactory.java:
package day09;
/**
 * 汽车生产工厂接口
 * @author 14532
 *
 */
public interface BMWFactory {
	BMW productBMW();
}
/**
 * 实现具体的车型的生产工厂
 * @author 14532
 *
 */
class BMW3Factory implements BMWFactory{//在BMW3Factory中改造BMW3为BMW3i
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马3系车");
		System.out.println("改造3系车,定名为BMW3i型号");
		return new BMW3i();//返回BMW3i
	}
	
}
class BMW5Factory implements BMWFactory{
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马5系车");
		return new BMW5();
	}
	
}
class BMW7Factory implements BMWFactory{
	@Override
	public BMW productBMW() {
		System.out.println("生产宝马7系车");
		return new BMW7();
	}
	
}
(2)开发人员B的工作没有变化:
 Test.java:
package day09;
public class Test2 {
	public static void main(String[] args) {
		//这是开发人员B的工作
		BMW b3 = new BMW3Factory().productBMW();
		b3.showInfo();
		
		BMW b5 = new BMW5Factory().productBMW();
		b5.showInfo();
		
		BMW b7 = new BMW7Factory().productBMW();
		b7.showInfo();
	}
}
输出结果:
 
通过工厂把new对象给隔离,通过产品的接口可以接收不同实际产品的实现类。实现的类名的改变不影响其他合作开发人员的编程。



















