抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

抽象工厂模式用来生产不同产品族的全部产品(对于新增加的产品无能为力,支持增加产品族)。

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

抽象工厂模式demo

public interface Engine {
	void run();
	void start();
}

class LuxuryEngine implements Engine{
	@Override
	public void run() {
		System.out.println("转的快");
	}
	@Override
	public void start() {
		System.out.println("启动快!可以自动启停!");
	}
}

class LowEngine implements Engine{
	@Override
	public void run() {
		System.out.println("转的慢");
	}
	@Override
	public void start() {
		System.out.println("启动慢!");
	}
}
public interface Seat {
	void massage();
}

class LuxurySeat implements Seat{
	@Override
	public void massage() {
		System.out.println("可以自动按摩");
	}
}

class LowSeat implements Seat{
	@Override
	public void massage() {
		System.out.println("不能按摩");
	}
}
public interface Tyre {
	void revolve();
}

class LuxuryTyre implements Tyre{
	@Override
	public void revolve() {
		System.out.println("旋转不磨损");
	}
}

class LowTyre implements Tyre{
	@Override
	public void revolve() {
		System.out.println("磨损快");
	}
}
public interface CarFactory {
	Engine createEngine();
	Seat createSeat();
	Tyre createTyre();
}
public class LowCarFactory implements CarFactory{
	@Override
	public Engine createEngine() {
		return new LowEngine();
	}
	@Override
	public Seat createSeat() {
		return new LowSeat();
	}
	@Override
	public Tyre createTyre() {
		return new LowTyre();
	}
}
public class LuxyryCarFactory implements CarFactory {
	@Override
	public Engine createEngine() {
		return new LuxuryEngine();
	}
	@Override
	public Seat createSeat() {
		return new LuxurySeat();
	}
	@Override
	public Tyre createTyre() {
		return new LuxuryTyre();
	}
}
public class Client {
	public static void main(String[] args) {
		System.out.println("====高级发动机的特性====");
		CarFactory luxyryCarFactory = new LuxyryCarFactory();
		Engine e = luxyryCarFactory.createEngine();
		e.run();
		e.start();

		System.out.println("====低级轮胎的特性====");
		CarFactory lowCarFactory = new LowCarFactory();
		Tyre lowCarFactoryTyre = lowCarFactory.createTyre();
		lowCarFactoryTyre.revolve();
	}
} 

运行结果如下:

可以看到,抽象工厂模式支持多个业务品种、业务分类。抽象工厂的每个方法都被声明成抽象,子类的方法覆盖这些方法来创建某些对象。所以说,抽象工厂的方法经常以工厂方法的方式实现。

类图

类图中将未使用到的Seat相关先隐藏了,不然生成的类图十分庞大。

工厂模式和抽象工厂模式的比较

简单工厂模式(静态工厂模式):虽然某种程度不符合设计原则,但是实际使用最多。(虽然简单工厂模式不是一种设计模式,但是它在实际应用中使用的场景还是很多的)。

工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展。

抽象工厂模式:不可增加产品,可以增加产品族。(产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。)

 

工厂方法与抽象工厂都是负责创建对象,工厂方法用的是继承,而抽象工厂用的是对对象的组合。

利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。这个工厂方法是用来创建对象的。整个工厂方法模式就是通过子类来创建对象。用这种做法,客户只需要他们所使用的抽象类型就可以了,由子类来负责决定具体类型,换句话说,工厂方法负责将客户从具体类型中解耦。

抽象工厂使用具体工厂用来创建产品(这里使用了工厂方法模式)。而工厂方法中,抽象创建者中所实现的代码通常会用到子类所创建的具体类型。

应用场景

JDK中Calendar的getInstance()

JDBC中Connection对象的获取

Hibernate中SessionFactory创建session

spring中IOC容器创建管理bean对象

XML解析时的DocumentBuilderFactory创建解析器对象

反射Class对象的newInstance()

 

以上为抽象工厂模式的学习笔记,此文章为尚学堂视频的学习笔记+自己总结。参考资料:Head First 设计模式。

更多推荐

Java学习笔记之--------抽象工厂模式