抽象工厂模式是基于简单工厂模式与工厂方法模式的拓展。
举例说明
键盘与鼠标都属于设备,ThinkPad生产键盘和鼠标,Mac也生产键盘和鼠标,那么产品关系如下
代码如下:
键盘
/**
* 键盘
*/
public interface Keyboard {
/**
* 键盘可以输入文字
*/
void type();
}
鼠标
/**
* 鼠标
*/
public interface Mouse {
/**
* 鼠标可以点击
*/
void click();
}
ThinkPad键盘
/**
* ThinkPad键盘
*/
public class ThinkPadKeyboard implements Keyboard {
@Override
public void type() {
System.out.println("ThinkPad键盘");
}
}
ThinkPad鼠标
/**
* ThinkPad鼠标
*/
public class ThinkPadMouse implements Mouse {
@Override
public void click() {
System.out.println("ThinkPad鼠标");
}
}
Mac键盘
/**
* Mac键盘
*/
public class MacKeyboard implements Keyboard {
@Override
public void type() {
System.out.println("Mac键盘");
}
}
Mac鼠标
/**
* Mac鼠标
*/
public class MacMouse implements Mouse {
@Override
public void click() {
System.out.println("Mac鼠标");
}
}
定义一个设备工厂,有两个方法,生产键盘createKeyboard,生产鼠标createMosue,定义ThinkPad设备工厂,生产ThinkPad键盘与鼠标,定义Mac设备工厂,生产Mac键盘与鼠标。
代码如下
/**
* 设备工厂
*/
public interface DeviceFactory {
/**
* 生产键盘
* @return
*/
Keyboard createKeyboard();
/**
* 生产鼠标
* @return
*/
Mouse createMouse();
}
ThinkPad设备工厂
/**
* ThinkPad设备工厂
*/
public class ThinkPadDeviceFactory implements DeviceFactory {
@Override
public Keyboard createKeyboard() {
return new ThinkPadKeyboard();
}
@Override
public Mouse createMouse() {
return new ThinkPadMouse();
}
}
Mac设备工厂
/**
* Mac设备工厂
*/
public class MacDeviceFactory implements DeviceFactory {
@Override
public Keyboard createKeyboard() {
return new MacKeyboard();
}
@Override
public Mouse createMouse() {
return new MacMouse();
}
}
这九个类/接口之间的关系如下图所示
还需要一个超级工厂来生产工厂,也就是工厂的工厂,这个类其实就是简单工厂模式
代码如下
/**
* 超级工厂,用来生产工厂
*/
public class FactoryProducer {
public static DeviceFactory getDeviceFactory(String deviceBrand){
if(deviceBrand.equalsIgnoreCase("thinkpad")){
return new ThinkPadDeviceFactory();
}else if(deviceBrand.equalsIgnoreCase("mac")){
return new MacDeviceFactory();
}
return null;
}
}
测试一下
public class Main {
public static void main(String[] args) {
DeviceFactory ThinkPadDeviceFactory = FactoryProducer.getDeviceFactory("thinkpad");
ThinkPadDeviceFactory.createKeyboard().type();
ThinkPadDeviceFactory.createMouse().click();
DeviceFactory MacDeviceFactory = FactoryProducer.getDeviceFactory("mac");
MacDeviceFactory.createKeyboard().type();
MacDeviceFactory.createMouse().click();
}
}
结果如下