厚积薄发打卡Day30 :[kuangStudy] GoF23通俗易懂的设计模式之 <抽象工厂模式>

前言:

视频教程:狂神说Java之通俗易懂的23种设计模式

什么是设计模式?

  • 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。
    它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的
    解决方案.
  • 1995年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软
    件的基础》一书,共收录了23种设计模式,从此树立了软件设计模式领域的里程碑,人称 【GoF设计模式】
  • GoF23: 一种思维,一种态度,一种进步

设计模式分类:

设计模式分类具体模式
创建型模式⌛单例模式、⌛工厂模式、⌛抽象工厂模式、建造者模式、原型模式
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式:模板方法模、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

抽象工厂模式

围绕着一个超级工厂创建其他工厂,该超级工厂又称作其他工厂的工厂[
在这里插入图片描述

1.介绍

  1. 定义:

    抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

  2. 适用场景:

    • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
    • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
    • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
  3. 优点:

    • 具体产品在应用层的代码隔离,无需关心创建的细节
    • 将一个系列的产品统一到一起创建
  4. 缺点:

    • 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;
    • 增加了系统的抽象性和理解难度
  5. 产品族与产品等级:

    相关博客:产品等级结构与产品组族

    (1) 产品等级结构:

    产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

    (2) 产品族:

    在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

    简单来说(个人理解):

    1. 产品等级:

      同类型产品:小米手机、华为手机 都是手机

    2. 产品族:

      同一品牌的产品:华为路由器、华为手机都是华为公司的产品

2.代码实例

  • 产品等级(产品类型):手机、路由器

在这里插入图片描述

  • 手机接口
/**
 * 手机产品接口
 */
public interface IPhoneProduct {
    //开机方法
    void start();
    //关机方法
    void shutdown();
    //打电话
    void  callup();
    //发信息
    void sendMessage();
}
  • 手机产品:

    • 华为手机
    public class HuaweiPhone implements IPhoneProduct {
        @Override
        public void start() {
            System.out.println("开启华为手机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭华为手机");
        }
    
        @Override
        public void callup() {
            System.out.println("用华为手机打电话");
        }
    
        @Override
        public void sendMessage() {
            System.out.println("用华为手机发短信");
        }
    }
    
    • 小米手机
    public class XiaomiPhone implements IPhoneProduct {
        @Override
        public void start() {
            System.out.println("开启小米手机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭小米手机");
        }
    
        @Override
        public void callup() {
            System.out.println("用小米手机打电话");
        }
    
        @Override
        public void sendMessage() {
            System.out.println("用小米手机发短信");
        }
    }
    
  • 路由器接口

//路由器产品
public interface IRouterProduct {
    //开机方法
    void start();
    //关机方法
    void shutdown();
    //打电话
    void  openWifi();
    //发信息
    void setting();
}
  • 路由器产品:

    • 华为路由器
    public class HuaweiRouter implements IRouterProduct {
        @Override
        public void start() {
            System.out.println("启动华为路由器");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭华为路由器");
        }
    
        @Override
        public void openWifi() {
            System.out.println("打开华为路由器wifi");
        }
    
        @Override
        public void setting() {
            System.out.println("打开华为路由器设置");
        }
    }
    
    • 小米路由器
    public class XiaomiRouter implements IRouterProduct{
        @Override
        public void start() {
            System.out.println("启动小米路由器");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭小米路由器");
        }
    
        @Override
        public void openWifi() {
            System.out.println("打开小米路由器wifi");
        }
    
        @Override
        public void setting() {
            System.out.println("打开小米路由器设置");
        }
    }
    
  • 产品族(品牌工厂):

    在这里插入图片描述

    • 总工厂(管理品牌工厂)
    //抽象产品工厂
    public interface IProductFactory {
    
        //生产手机
        IPhoneProduct PHONE_PRODUCT();
    
        //生产路由器
        IRouterProduct ROUTER_PRODUCT();
    }
    
    • 子工厂(具体生产产品的工厂)

      • 华为工厂:
      public class HuaweiFactory implements IProductFactory {
          @Override
          public IPhoneProduct PHONE_PRODUCT() {
              return new HuaweiPhone();
          }
      
          @Override
          public IRouterProduct ROUTER_PRODUCT() {
              return new HuaweiRouter();
          }
      }
      
      • 小米工厂:
      public class XiaomiFactory implements IProductFactory {
          @Override
          public IPhoneProduct PHONE_PRODUCT() {
              return new XiaomiPhone();
          }
      
          @Override
          public IRouterProduct ROUTER_PRODUCT() {
              return new XiaomiRouter();
          }
      }
      
  • 消费者:

    public class Client {
        public static void main(String[] args) {
            System.out.println("============小米工厂============");
            XiaomiFactory xiaomiFactory = new XiaomiFactory();
            IPhoneProduct phoneProduct = xiaomiFactory.PHONE_PRODUCT();
            phoneProduct.start();
            phoneProduct.sendMessage();
    
            IRouterProduct routerProduct = xiaomiFactory.ROUTER_PRODUCT();
            routerProduct.start();
            routerProduct.openWifi();
    
            System.out.println("============华为工厂============");
            HuaweiFactory huaweiFactory = new HuaweiFactory();
            IPhoneProduct phoneProduct_huawei = huaweiFactory.PHONE_PRODUCT();
            phoneProduct_huawei.start();
            phoneProduct_huawei.sendMessage();
    
            IRouterProduct routerProduct_huawei = huaweiFactory.ROUTER_PRODUCT();
            routerProduct_huawei.start();
            routerProduct_huawei.openWifi();
    
        }
    }
    
    ============小米工厂============
    开启小米手机
    用小米手机发短信
    启动小米路由器
    打开小米路由器wifi
    ============华为工厂============
    开启华为手机
    用华为手机发短信
    启动华为路由器
    打开华为路由器wifi
    

概览图:

在这里插入图片描述

工厂模式小结:

  • 简单工厂模式(静态工厂模式)

    虽然某种程度上不符合设计原则,但实际使用最多!

  • 工厂方法模式

    不修改已有类的前提下,通过增加新的工厂类实现扩展.

  • 抽象工厂模式

    不可以增加产品,可以增加产品族!

应用场景:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值