最新消息

Java抽象工厂模式(Abstract Factory)

设计模式 金牌剑客 1397℃ 0评论

定义

为一系列相关对象或相互依赖的对象创建一个接口,而无需指定它们的具体类。抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,以供客户端使用

情景

假设现在有一个车辆制造工厂,它生产两种车,A类车和B类车,每类车有其各自的车门和轮子。A类车的车间有生产车门的工作,有生产轮子的工作;B类车的车间有生产车门的工作,有生产轮子的工作。我们需要哪类车的部件时,就去哪个车间拿,拿的过程(相同的操作,抽取出来一个抽象工厂类,这里的拿就是指方法)是一样的。

UML类图

abstractFactory

Java代码

IDoor.java

public interface IDoor {
	public void createDoor();
}

IWheel.java

public interface IWheel {
	public void createWheel();
}

ADoor.java

public class ADoor implements IDoor {
	public void createDoor() {
		System.out.println("ADoor");
	}
}

BDoor.java

public class BDoor implements IDoor {
	public void createDoor() {
		System.out.println("BDoor");
	}
}

AWheel.java

public class AWheel implements IWheel {
	public void createWheel() {
		System.out.println("AWheel");
	}
}

BWheel.java

public class BWheel implements IWheel {
	public void createWheel() {
		System.out.println("BWheel");
	}
}

IAbstractFactory.java

public interface IAbstractFactory {
	public IDoor getDoor();
	public IWheel getWheel();
}

AFactory.java

public class AFactory implements IAbstractFactory {
	public IDoor getDoor() {
		return new ADoor();
	}
	public IWheel getWheel() {
		return new AWheel();
	}
}

BFactory.java

public class BFactory implements IAbstractFactory {
	public IDoor getDoor() {
		return new BDoor();
	}
	public IWheel getWheel() {
		return new BWheel();
	}
}

Client.java

public class Client {
	public static void main(String[] args) {
		IAbstractFactory aFactory = new AFactory();
		IAbstractFactory bFactory = new BFactory();
		aFactory.getDoor().createDoor();
		aFactory.getWheel().createWheel();
		bFactory.getDoor().createDoor();
		bFactory.getWheel().createWheel();
	}
}

优缺点

优点

分离接口和实现

客户端通过抽象工厂创建对象,而客户端根本不知道具体的对象实现是谁,客户端只是面向产品的接口编程而已。也就是说客户端从具体的产品中解耦。

切换产品簇变得容易

一个具体的工厂实现代表一个产品簇,客户端选择不同的工厂实现,就相当于在切换不同的产品簇。

缺点

扩展产品比较困难

在给整个产品簇增加一个新的产品时,需要修改各个子类。比如:在抽象工厂中增加一个引擎的方法,需要修改抽象工厂的各个实现类。

转载请注明:QualInfo » Java抽象工厂模式(Abstract Factory)

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址