概述
抽象工厂模式是一种创建型设计模式,抽象工厂模式与工厂方法模式的主要区别是工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
抽象工厂模式是工厂方法模式的升级版本,用来创建一组相关或者相互依赖的对象.工厂方法模式产生的产品都衍生自同一个接口或抽象类
,而抽象工厂模式则是衍生自不同的接口或抽象类.
UML
- AbstractFactory : 抽象工厂角色,声明了一组用于创建一种产品的方法,每一个方法对应一个产品.
- ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体的产品.
- AbstractProduct : 抽象产品角色,它为每种产品声明接口.
- ConcreteProduct : 具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法.
适用场景
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时(一个继承体系中,存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束).
示例
以台式机为例,需要不同配置的主机和显示器等配件。工厂开始生产空调和发动机,用来组装电脑。这时候工厂有两个系列的产品:主机和显示器。华硕和惠普电脑配置对应的主机和显示器 。
抽象工厂模式代码
产品类:
public interface Host {
}
class AsusComputerHost implements Host{
public AsusComputerHost() {
System.out.println("制造华硕主机");
}
}
class HPComputerHost implements Host{
public HPComputerHost() {
System.out.println("制造惠普主机");
}
}
public interface Screen {
}
class AsusComputerScreen implements Screen{
public AsusComputerScreen() {
System.out.println("制造华硕显示屏");
}
}
class HPComputerScreen implements Screen{
public HPComputerScreen() {
System.out.println("制造惠普显示屏");
}
}
创建工厂类:
public abstract class AbstractFactory {
public abstract Screen createScreen();
public abstract Host createHost();
}
public class FactoryAsus extends AbstractFactory {
@Override
public Screen createScreen() {
return new AsusComputerScreen();
}
@Override
public Host createHost() {
return new AsusComputerHost();
}
}
public class FactoryHP extends AbstractFactory{
@Override
public Screen createScreen() {
return new HPComputerScreen();
}
@Override
public Host createHost() {
return new HPComputerHost();
}
}
客户:
public class Test {
public static void main(String[] args) {
FactoryAsus factoryAsus = new FactoryAsus();
factoryAsus.createHost();
factoryAsus.createScreen();
FactoryHP factoryHP = new FactoryHP();
factoryHP.createHost();
factoryHP.createScreen();
}
}
总结
关于抽象工厂模式与工厂方法模式的区别,以及产品族、等级结构等概念,应该比较好理解。
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
### see source code