1. 什么是抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
也就是说抽象工厂模式是用来 创建产品的家族的。
为了理解这个定义,我们先要搞清楚什么是产品的家族。
那么什么是产品的家族哪,我的理解就是一群相关的产品的集合。那披萨来说,披萨的面饼,作料,酱汁等这些组合在一起,那么就成为了产品族。
好了等理解了产品家族这个概念,现在来看一下具体的抽象工厂的结构吧。
2. 抽象工厂模式的结构
从类图中我们可以看到,抽象工厂提供了一个Creater接口,用来创建一个产品家族。而Creater的每个具体的子类(ConcreateCreate1等)都创建一个家族的产品,在这些子类中的方法则用来负责在抽象工厂中创建具体的产品(ProductA等)(通常是以”工厂方法来实现的”)。
下面请看示例代码:
Creator:
public interface ComputerFactory {
Cpu createCpu();
Board cerateBoard();
}
ConcreteCrator:
public class IntelComputer implements ComputerFactory{
@Override
public Cpu createCpu() {
return new IntelCpu();
}
@Override
public Board cerateBoard() {
return new IntelBoard();
}
}
public class AmdComputer implements ComputerFactory{
@Override
public Cpu createCpu() {
return new AmdCpu();
}
@Override
public Board cerateBoard() {
return new AmdBoard();
}
}
Product:
public interface Cpu {
void model();
}
public interface Board {
void model();
}
ConcreteProduct:
Intel的产品家族:
public class IntelCpu implements Cpu {
@Override
public void model() {
System.out.println("this is IntelCpu");
}
}
public class IntelBoard implements Board {
@Override
public void model() {
System.out.println("this is IntelBoard");
}
}
amd的产品家族:
public class AmdCpu implements Cpu{
@Override
public void model() {
System.out.println("this is AmdCpu");
}
}
public class AmdBoard implements Board {
@Override
public void model() {
System.out.println("this is AmdBoard");
}
}
测试类:
public class Client {
public static void main(String[] args){
ComputerFactory cf = new IntelComputer();
Cpu cpu = cf.createCpu();
Board board = cf.cerateBoard();
cpu.model();
board.model();
cf = new AmdComputer();
cpu = cf.createCpu();
board = cf.cerateBoard();
cpu.model();
board.model();
}
}
输出结果:
在上面的代码中,Cpu和Board组合在一起就成为了一个产品家族,由抽象工厂来创建。
而具体的Cpu或者Board则可以使用工厂方法来创建(这里不做演示)。
3、抽象工厂模式和工厂方法模式比较
工厂方法模式:整个工厂方法模式,只不过是通过子类来创建对象,用这种方法,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体的类型,所以这样就将客户从具体类型中解耦了。
抽象工厂模式:提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。在抽象工厂中,经常使用 工厂方法来实现具体的工厂
4、对所有工厂模式的总结
1、所有工厂都是用来封装对象的创建。
2、工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
3、抽象工厂使用对象的组合:对象的创建在工厂接口所暴露的方法中实现。
4、所有的工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合,使设计更具有弹性。