定义: 多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品的实现
结构图:通过使用抽象工厂模式,可以处理具有相同或相似等级结构中多个产品族中的产品对象的创建问题,
由于这两个产品族的等级结构相同,因此使用同一个工厂族也可处理这两个产品族的创建问题,这就是抽象工厂模式,
可以看出,每个工厂角色都有两个工厂方法,分别负责创建分属不同产品等级结构的产品对象。
适用场景
1、一个系统不应当依赖于产品实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的
2、这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
3、同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来
4、系统提供一个产品类的库,所有的产品以相同的接口出现,从而使客户端不依赖于实现。
优点
1、分离接口和实现:客户端使用抽象工厂模式来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,也就是说,客户端从具体的产品实现中解藕
2、使切换产品族变得容易,因为一个具体的工厂代表的是一个产品族
缺点
1、不太容易扩展新的产品:如果需要给整个产品族添加一个新产品,那么就需要修改抽象工厂,就会导致修改所有的工厂实现类。
注意:抽象工厂模式和工厂模式最大的区别是:工厂方法模式针对的是一个产品等级结构,抽象工厂模式则要面对多个产品等级结构。
public interface Cpu {
public void calculate();
}
public class IntelCpu implements Cpu{
private int pins = 0;
public IntelCpu(int pins){
this.pins = pins;
}
@Override
public void calculate() {
System.out.println("intel cps针脚数 "+pins);
}
}
public class AmdCpu implements Cpu{
private int pins = 0;
public AmdCpu(int pins){
this.pins = pins;
}
@Override
public void calculate() {
System.out.println("amd cpu针脚数 "+pins);
}
}
public interface Mainboard {
public void installCPU();
}
public class IntelMainboard implements Mainboard{
private int cpuHoles = 0;
public IntelMainboard(int cpuHoles){
this.cpuHoles = cpuHoles;
}
@Override
public void installCPU() {
System.out.println("intel主板的 cpu插槽孔数 "+cpuHoles);
}
}
public class AmdMainboard implements Mainboard{
private int cpuHoles;
public AmdMainboard(int cpuHoles){
this.cpuHoles = cpuHoles;
}
@Override
public void installCPU() {
System.out.println("amd主板的cpu插槽孔数 "+cpuHoles);
}
}
public interface AbstractFactory {
public Cpu createCpu();
public Mainboard createMainboard();
}
public class IntelFactory implements AbstractFactory{
@Override
public Cpu createCpu() {
return new IntelCpu(755);
}
@Override
public Mainboard createMainboard() {
return new IntelMainboard(755);
}
}
public class AmdFactory implements AbstractFactory{
@Override
public Cpu createCpu() {
return new AmdCpu(938);
}
@Override
public Mainboard createMainboard() {
return new AmdMainboard(938);
}
}
public class ComputerEngineer {
private Cpu cpu = null;
private Mainboard mainboard = null;
public void makeComputer(AbstractFactory factory){
prepareHardwares(factory);
}
public void prepareHardwares(AbstractFactory factory) {
cpu = factory.createCpu();
mainboard = factory.createMainboard();
cpu.calculate();
mainboard.installCPU();
}
}
public class Client {
public static void main(String[] args) {
ComputerEngineer engineer = new ComputerEngineer();
engineer.makeComputer(new IntelFactory());
engineer.makeComputer(new AmdFactory());
}
}