Java抽象工厂模式之理解

抽象工厂模式

思考

在理解为什么使用这个模式之前,我们考虑这样一个场景:

  • 有两种设备:鼠标(Mouse)和键盘(Keyboard)。
  • 有两种品牌的鼠标和键盘,罗技鼠标,罗技键盘,雷蛇鼠标,雷蛇键盘。
  • 有一个生产外设的工厂接口(PeripheralFactory)专门用来生产鼠标和键盘。
  • 有两个商家都生产外设,罗技和雷蛇,他们都有自己的生产工厂分别是。(LogitechPeripheralFactory)、(RazerPeripheralFactory),他们都实现外设工厂接口。

当我们需要一个鼠标或者键盘的时候,我们都可以通过对应的工厂来生产不同品牌的鼠标或者键盘。

类图

用intellij生成的类图

代码:

键盘
//键盘
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,这个品牌也是生产这个产品族的,那么我们就可以创建一个新的工厂来生成,保证了原有代码的不变就可以添加新的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值