23个java设计模式(十)-- 工厂方法模式

2016年03月18日 原创
关键词: java 设计模式
摘要 工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。

一、概述。

工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。

得到一个类的子类的实例最常用的办法就是使用new运算符和该子类的构造方法,但是在某些情况下,用户可能不应该或无法使用这种办法来得到一个子类的实例,其原因是系统不允许用户代码和该类的子类形成耦合或者用户不知道该类有哪些子类可用。

当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。

二、工厂方法模式的结构。

工厂方法模式的结构中包括四种角色:

  • 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
  • 具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类。
  • 构造者(Creator):一个接口或抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
  • 具体构造者(ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者的类。具体构造者重写工厂方法使该方法返回具体产品的实例。

三、示例程序。

抽象产品(Product)

public abstract class PenCore {
	protected String color;
	public abstract void writeWord(String word);
	public String getColor() {
		return color;
	}
	
}

具体产品(ConcreteProduct)

public class RedPenCore extends PenCore{
	
	
	public RedPenCore() {
		super();
		color = "红色";
	}

	@Override
	public void writeWord(String word) {
		System.out.println("写出"+color+"的字:"+word);
	}

}

public class BluePenCore extends PenCore{
	
	
	public BluePenCore() {
		super();
		color = "蓝色";
	}

	@Override
	public void writeWord(String word) {
		System.out.println("写出"+color+"的字:"+word);
	}

}

public class BlackPenCore extends PenCore{
	
	
	public BlackPenCore() {
		super();
		color = "黑色";
	}

	@Override
	public void writeWord(String word) {
		System.out.println("写出"+color+"的字:"+word);
	}

}

构造者(Creator)

public abstract class BallPen {
	public BallPen() {
		System.out.println("生产了一只装有"+getPenCore().getColor()+"笔芯的圆珠笔");
	}
	public abstract PenCore getPenCore();
}

具体构造者(ConcreteCreator)

public class RedBallPen extends BallPen {

	@Override
	public PenCore getPenCore() {
		return new RedPenCore();
	}

}

public class BlueBallPen extends BallPen{

	@Override
	public PenCore getPenCore() {
		return new BluePenCore();
	}

}

public class BlackBallPen extends BallPen{

	@Override
	public PenCore getPenCore() {
		return new BlackPenCore();
	}

}

测试程序

public class Example1Test {
	@Test
	public void testMain() {
		PenCore penCore;
		BallPen ballPen = new BlueBallPen();
		penCore = ballPen.getPenCore();
		penCore.writeWord("你好,很高兴认识你");
		ballPen = new RedBallPen();
		penCore = ballPen.getPenCore();
		penCore.writeWord("How are you?");
		ballPen = new BlackBallPen();
		penCore = ballPen.getPenCore();
		penCore.writeWord("nice to meet you");
	}
}

四、工厂方法模式的优点。

  1. 使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。
  2. 工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。

五、适合使用工厂方法模式的情景。

  1. 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
  2. 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。