实战java设计模式(四)抽象工厂模式

承上:实战java设计模式(三)工厂方法模式

1 介绍

工厂方法模式的问题是每一个工厂只能生产一种产品。试想这样一个场景一个厂要生产螺丝的同时要配对生产螺丝冒,生产乒乓球的同时配对生产乒乓球盒,生产产品的时候同时配对生产产品包装。

2 例子

还是手机生产的例子,但是生产手机的同时需要生产配对的手机充电器。如果采用工厂方法模式就需要对每一个产品进行编写类和工厂类,而且还需要编写配对的逻辑,显然不是一种优雅的处理方式,于是抽象工厂模式就可以利用起来了。

2.1 手机接口

//手机接口
interface Phone {
    //显示logo
    void showLogo();
    //当然手机还有其他方法……
}

2.2 实现手机类

假设有3种,苹果小米和华为。

//苹果手机类
class ApplePhone implements Phone {
    //手机的其他属性和方法
    @Override
    public void showLogo() {
        System.out.println("这是苹果手机的LOGO");
    }
}
//小米手机
class XiaoMiPhone implements Phone {

    @Override
    public void showLogo() {
        System.out.println("这是小米手机的LOGO");
    }
}
//华为手机
class HuaweiPhone implements Phone {
    @Override
    public void showLogo() {
        System.out.println("这是华为手机的LOGO");
    }
}

2.3 充电器接口

//充电器接口
interface Charger {
    //充电器的方法
    void charging();
}

2.4 充电器实现

假设有两种充电器typeC和lightning的。

//typec充电器
class TypeCCharger implements Charger {

    @Override
    public void charging() {
        System.out.println("type-c接口的充电器正在充电");
    }
}
//Lightning接口的充电器
class LightningCharger implements Charger {

    @Override
    public void charging() {
        System.out.println("Lightning接口的充电器正在充电");
    }
}

2.5 抽象工厂接口

//定义一个抽象工厂
interface Factory {
    //生产手机
    Phone getPhone();

    //生产充电器
    Charger getCharger();
}

2.6 工厂实现

//苹果厂
class AppleFactory implements Factory {

    @Override
    public Phone getPhone() {
        return new ApplePhone();
    }

    @Override
    public Charger getCharger() {
        return new LightningCharger();
    }
}
//华为厂
class HuaweiFactory implements Factory {

    @Override
    public Phone getPhone() {
        return new HuaweiPhone();
    }

    @Override
    public Charger getCharger() {
        return new TypeCCharger();
    }
}
//小米厂
class XiaomiFactory implements Factory {

    @Override
    public Phone getPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Charger getCharger() {
        return new TypeCCharger();
    }
}

2.7 测试主类

public class Main {
    public static void main(String[] args) {
        //创建三个厂
        Factory xiaomiFactory = new XiaomiFactory();
        Factory huaweiFactory = new HuaweiFactory();
        Factory appleFactory = new AppleFactory();

        //生产对象
        Phone xiaomiPhone = xiaomiFactory.getPhone();
        Charger xiaomiCharger = xiaomiFactory.getCharger();
        Phone applePhone = appleFactory.getPhone();
        Charger appleCharger = appleFactory.getCharger();
        Phone huaweiPhone = huaweiFactory.getPhone();
        Charger huaweiCharger = huaweiFactory.getCharger();


        //使用对象
        xiaomiPhone.showLogo();
        xiaomiCharger.charging();
        System.out.println("---");
        huaweiPhone.showLogo();
        huaweiCharger.charging();
        System.out.println("---");
        applePhone.showLogo();
        appleCharger.charging();

    }
}

运行结果:

这是小米手机的LOGO
type-c接口的充电器正在充电
---
这是华为手机的LOGO
type-c接口的充电器正在充电
---
这是苹果手机的LOGO
Lightning接口的充电器正在充电

3 例子升华

两个产品的设计模式中规中矩按照抽象接口实现。关键就在于抽象工厂的接口的设计,设计了这种工厂需要生产哪些产品,实现工厂具体是实现需要生产的产品簇,注意从两个维度是去理解抽象工厂模式,一是工厂视角,而是产品视角。

4 总结

4.1 核心角色

  • 各个产品抽象:不仅有一个产品抽象;
  • 多个产品实现:每个产品抽象又有多个产品实现;
  • 抽象工厂:工厂需要哪些产品作为一个模板;
  • 工厂实现:每个工厂都会生产一簇产品(注意不是同样父类的一系列产品),是不同抽象类的。

4.2 核心结构

抽象工厂会生产一簇产品,比如:手机和充电器、螺丝和螺帽、杯子和杯盖等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值