【设计模式】抽象工厂模式

本篇文章总结自 【狂神说Java抽象工厂模式】bilibili 狂神说Java抽象工厂模式

工厂模式本质:

  1. 实例化不用new,用工厂模式来代替
  2. 可选择实现类,创建对象统一管理和控制,从而将调用者与实现类解耦

先来看抽象工厂模式的结构图:
在这里插入图片描述

可以看到产品分支与工厂分支是独立开来的,产品分支分为多个产品接口,一个产品接口又可以有多个实现类。而工厂分支中的大工厂指定了可以生产哪些产品,其实现类(华为厂商或小米厂商)可以直接new出产品并返回。在测试类中需要某个厂商的某个产品时,直接new出需要的厂商并调用其获取产品的方法。

代码结构:
在这里插入图片描述
以下是手机产品接口:

//手机产品接口
public interface IPhoneProduct {

    void start();
    void end();
    void call();
    void sendMessage();

}

华为手机实现类:

//华为手机产品
public class HuaweiPhone implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("华为手机开机");
    }

    @Override
    public void end() {
        System.out.println("华为手机关机");
    }

    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }

    @Override
    public void sendMessage() {
        System.out.println("华为手机发短信");
    }
}

小米手机实现类与华为手机实现类类似,路由器产品结构跟手机产品结构类似,不放出代码
以下是大工程的接口:

//生产各类产品的大工厂
public interface ProducingFactory {

    IPhoneProduct producingPhone(); // 生产手机

    IRouterProduct producingRouter(); // 生产路由器

}

以下是华为厂商实现类:

//华为工厂 可以生产华为手机与华为路由器
public class HuaweiFactory implements ProducingFactory {
    @Override
    public IPhoneProduct producingPhone() {
        return new HuaweiPhone();
    }

    @Override
    public IRouterProduct producingRouter() {
        return new HuaweiRouter();
    }
}

以下是小米厂商实现类:

//小米工厂 可以生产小米手机与小米路由器
public class XiaomiFactory implements ProducingFactory {
    @Override
    public IPhoneProduct producingPhone() {
        return new XiaomiPhone();
    }

    @Override
    public IRouterProduct producingRouter() {
        return new XiaomiRouter();
    }
}

测试方法:

public static void main(String[] args) {
        //华为系列产品
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        IPhoneProduct huaweiPhone = huaweiFactory.producingPhone();
        huaweiPhone.call();

        IRouterProduct huaweiRouter = huaweiFactory.producingRouter();
        huaweiRouter.openNet();

        //小米系列产品
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IPhoneProduct xiaomiPhone = xiaomiFactory.producingPhone();
        xiaomiPhone.call();

        IRouterProduct xiaomiRouter = xiaomiFactory.producingRouter();
        xiaomiRouter.openNet();
    }

在这里插入图片描述

该设计模式优缺点:

优点:

  1. 厂商是具有可扩展性的,可有多个厂商去生产手机与路由器
  2. 厂商可以将一个系列的产品放到一起创建
  3. 调用者无需关心产品的创建过程,只需要获取工厂即可

缺点:

  1. 如果要生产更多的产品就必须要改动大工厂,厂商也需改动,产品集合被固定了
  • 应用场景:
    JDK中Calendar的getlInstance方法
    JDBC中的Connection对象的获取
    Spring中IOC容器创建管理bean对象
    反射中Class对象的newInstance方法
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值