设计模式(创建型)---抽象工厂模式

抽象工厂模式是基于简单工厂模式与工厂方法模式的拓展。

举例说明

键盘与鼠标都属于设备,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();
    }
}

结果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值