23种设计模式之:抽象工厂模式

前言

抽象工厂模式适用于品牌不同,但种类相同的项目,如下图所示:
在这里插入图片描述

抽象工厂结构

抽象工厂由四个角色组成:

  1. 抽象工厂(Abstract Factory):将不同的种类抽象到工厂类里:IAbstractFactory
  2. 具体工厂(Concrete Factory):用不同工厂对接不同的品牌种类:HwFactoryImpl、MiFactoryImpl
  3. 抽象产品(Product):将种类抽象到接口里:IPhoneProduct、IRouterProduct
  4. 具体产品(ConcreteProduct):具体实现功能,例如小米手机的开关机,华为手机开关机等
    在这里插入图片描述

详细代码

抽象工厂

public interface IAbstractFactory {
    // 手机
    IPhoneProduct phoneFactory();

    // 路由器
    IRouterProduct routerFactory();
}

具体工厂

public class MiFactoryImpl implements IAbstractFactory {
	// 负责对接小米手机产品
    @Override
    public IPhoneProduct phoneFactory() {
        return new MiPhoneProductImpl();
    }

	// 负责对接小米路由器产品
    @Override
    public IRouterProduct routerFactory() {
        return new MiRouterProductImpl();
    }
}
public class HwFactoryImpl implements IAbstractFactory {
	// 负责对接华为手机产品
    @Override
    public IPhoneProduct phoneFactory() {
        return new HwPhoneProductImpl();
    }

	// 负责对接华为路由器产品
    @Override
    public IRouterProduct routerFactory() {
        return new HwRouterProductImpl();
    }
}

抽象产品

// 手机产品
public interface IPhoneProduct {
    void start();

    void end();
}
// 路由器产品
public interface IRouterProduct {
    void start();

    void end();
}

具体产品

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

    @Override
    public void end() {
        System.out.println("华为手机关机");
    }
}
// 华为路由器产品功能实现
public class HwRouterProductImpl implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("华为路由器开机");
    }

    @Override
    public void end() {
        System.out.println("华为路由器关机");
    }
}
// 小米手机产品功能实现
public class MiPhoneProductImpl implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("小米手机开机");
    }

    @Override
    public void end() {
        System.out.println("小米手机关机");
    }
}
// 小米路由器产品功能实现
public class MiRouterProductImpl implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("小米路由器开机");
    }

    @Override
    public void end() {
        System.out.println("小米路由器关机");
    }
}

具体使用

	public static void main(String[] args) {
        // 创建小米工厂
        IAbstractFactory miFactory = new MiFactoryImpl();
        // 获取小米手机产品
        IPhoneProduct miPhone = miFactory.phoneFactory();
        miPhone.start();
        miPhone.start();
        // 获取小米路由器产品
        IRouterProduct miRouter = miFactory.routerFactory();
        miRouter.start();
        miRouter.end();

        // 创建华为工厂
        IAbstractFactory hwFactory = new HwFactoryImpl();
        // 获取华为手机产品
        IPhoneProduct hwPhone = hwFactory.phoneFactory();
        hwPhone.start();
        hwPhone.end();
        // 获取华为路由器产品
        IRouterProduct hwRouter = hwFactory.routerFactory();
        hwRouter.start();
        hwRouter.end();
    }

优缺点

优点

  • 将一个不同品牌相同种类绑定在一起,在使用上非常方便,也更容易理解。
  • 解耦:工厂统一管理,和实际调用代码分开
  • 不变种类的情况下,新增一个品牌非常简单,也符合OCP原则(在设计时,应当可以在不被修改的情况下扩展)

缺点

  • 新增一个种类相对比较麻烦,比如增加一个平板
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月下一棵树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值