抽象工厂模式
思考
在理解为什么使用这个模式之前,我们考虑这样一个场景:
- 有两种设备:鼠标(Mouse)和键盘(Keyboard)。
- 有两种品牌的鼠标和键盘,罗技鼠标,罗技键盘,雷蛇鼠标,雷蛇键盘。
- 有一个生产外设的工厂接口(PeripheralFactory)专门用来生产鼠标和键盘。
- 有两个商家都生产外设,罗技和雷蛇,他们都有自己的生产工厂分别是。(LogitechPeripheralFactory)、(RazerPeripheralFactory),他们都实现外设工厂接口。
当我们需要一个鼠标或者键盘的时候,我们都可以通过对应的工厂来生产不同品牌的鼠标或者键盘。
类图
代码:
键盘
//键盘
public interface KeyBoard {
public String click();
}
//具体键盘 罗技键盘
public class LogitechKeyBoard implements KeyBoard{
@Override
public String click() {
// TODO Auto-generated method stub
return "罗技键盘按下";
}
}
//具体键盘 雷蛇键盘
public class RazerKeyBoard implements KeyBoard {
@Override
public String click() {
// TODO Auto-generated method stub
return "雷蛇键盘按下";
}
}
鼠标
//鼠标
public interface Mouse {
public String move();
}
//具体鼠标 罗技鼠标
public class LogitechMouse implements Mouse{
@Override
public String move() {
// TODO Auto-generated method stub
return "罗技鼠标移动";
}
}
//具体鼠标 雷蛇鼠标
public class RazerMouse implements Mouse{
@Override
public String move() {
// TODO Auto-generated method stub
return "雷蛇鼠标移动";
}
}
工厂
//工厂,提供生产鼠标和键盘的功能
public interface PeripheralFactory {
Mouse createMouse();
KeyBoard createKeyBoard();
}
//罗技工厂,生产罗技品牌的鼠标和键盘
public class LogitechPeripheralFactory implements PeripheralFactory {
@Override
public Mouse createMouse() {
// TODO Auto-generated method stub
return new LogitechMouse();
}
@Override
public KeyBoard createKeyBoard() {
// TODO Auto-generated method stub
return new LogitechKeyBoard();
}
}
//雷蛇工厂,生产雷蛇品牌的鼠标和键盘
public class RazerPeripheralFactory implements PeripheralFactory {
@Override
public Mouse createMouse() {
// TODO Auto-generated method stub
return new RazerMouse();
}
@Override
public KeyBoard createKeyBoard() {
// TODO Auto-generated method stub
return new RazerKeyBoard();
}
}
测试
public class Test {
public static void main(String[] args) {
PeripheralFactory lFactory = new LogitechPeripheralFactory();
PeripheralFactory rFactory = new RazerPeripheralFactory();
Mouse lMouse = lFactory.createMouse();
KeyBoard lKeyBoard = lFactory.createKeyBoard();
Mouse rMouse = rFactory.createMouse();
KeyBoard rKeyBoard = rFactory.createKeyBoard();
System.out.println(lMouse.move());
System.out.println(lKeyBoard.click());
System.out.println(rMouse.move());
System.out.println(rKeyBoard.click());
}
}
结果
罗技鼠标移动
罗技键盘按下
雷蛇鼠标移动
雷蛇键盘按下
总结
我们通过创建两种不同的工厂,生产出了属于不同类型的鼠标和键盘,这里面,鼠标和键盘被成为产品族,产品族就是一个工厂所能生产的所有产品,产品族可被多种工厂生产出来。假如我们现在又出现了一个品牌S,这个品牌也是生产这个产品族的,那么我们就可以创建一个新的工厂来生成,保证了原有代码的不变就可以添加新的功能。