设计模式之抽象工厂

2023-11-04

在这里插入图片描述抽象工厂模式结构图

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

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工程又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

产品族:一个工厂类生产出的产品属于一个产品族,视作具体工厂类生产出来的具体产品类
产品等级:不同工厂类的同一个产品等级,产品等级可以视作继承抽象工厂类的工厂类

手机、电脑两种产品,有华为和苹果两个工厂,两个工厂都可以生产手机和电脑;

1、手机和电脑两种产品,定义两个接口
2、华为和苹果都可以生产者手机和电脑,所以有4个实现类;
3、需要创建华为和苹果的工厂类,先将工厂类进行抽象,里面有创建两个产品的方法,返回的是产品的接口类
4、创建华为和苹果的工厂实现类,继承工厂类接口,实现创建各自产品的方法
5、客户端调用时,直接用工厂接口类创建需要的工厂,拿到对应的产品

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("----------华为工厂----------");
            IProductFactory huaweiFactory = new HuaweiFactory();//创建华为工厂
           

            //生产华为手机
            IPhoneProduct huaweiPhone = huaweiFactory.phoneProduct();
            huaweiPhone.Show();
            huaweiPhone.Open();

            //生产华为电脑
            IComputerProduct huaweicomputer = huaweiFactory.computerProduct();
            huaweicomputer.Show();
            huaweicomputer.Open();



            Console.WriteLine("----------苹果工厂----------");
            IProductFactory appleFactory = new AppleFactory();//创建苹果工厂

            //生产苹果手机
            IPhoneProduct applePhone = appleFactory.phoneProduct();
            applePhone.Show();
            applePhone.Open();

            //生产苹果电脑
            IComputerProduct applecomputer = appleFactory.computerProduct();
            applecomputer.Show();
            applecomputer.Open();


            Console.ReadLine();

        }
    }

    //手机产品接口
    public interface IPhoneProduct
    {
        public  void Open()
        {
            Console.WriteLine("开机");
        }
        public  void Close()
        {
            Console.WriteLine("关机");
        }
        public  void Show()
        {
            Console.WriteLine("我是手机");
        }
    }

    //华为手机
    public class HuaweiPhone:IPhoneProduct
    {
        public  void Open()
        {
            Console.WriteLine("华为手机开机");
        }
        public void Close()
        {
            Console.WriteLine("华为手机关机");
        }
        public void Show()
        {
            Console.WriteLine("我是华为手机");
        }

    }
    //苹果手机
    public class ApplePhone : IPhoneProduct
    {
        public void Open()
        {
            Console.WriteLine("苹果手机开机");
        }
        public void Close()
        {
            Console.WriteLine("苹果手机关机");
        }
        public void Show()
        {
            Console.WriteLine("我是苹果手机");
        }
    }


    //电脑产品接口
    public interface IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是电脑");
        }

    }

    //华为电脑
    public class HuaweiComputer:IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("华为电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("华为电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是华为电脑");
        }
    }
    //苹果电脑
    public class AppleComputer:IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("苹果电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("苹果电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是苹果电脑");
        }

    }


    //抽象工厂类
    public interface IProductFactory
    {
        //生产手机
        IPhoneProduct phoneProduct();

        //生产电脑
        IComputerProduct computerProduct();
    }


    //华为工厂实现类
    public class HuaweiFactory : IProductFactory
    {
        public IComputerProduct computerProduct()
        {
            return new HuaweiComputer();
        }

        public IPhoneProduct phoneProduct()
        {
            return new HuaweiPhone();
        }
    }

    //苹果工厂实现类

    public class AppleFactory : IProductFactory
    {
        public IComputerProduct computerProduct()
        {
            return new AppleComputer();
        }

        public IPhoneProduct phoneProduct()
        {
            return new ApplePhone();
        }
    }

抽象工厂模式的优缺点
优点:一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建)

缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;
增加了系统的抽象性和理解难度

适用场景

1、一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码
2、提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

抽象工厂模式符合依赖抽象原则
创建对象实例时,不要直接new 一个对象,而是把创建对象的动作放在一个工厂的方法中
不要让类继承具体类,而是继承抽象类或者是实现接口。
不要覆盖基类中以及实现的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之抽象工厂 的相关文章

  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • 设计模式-单一职责原则介绍与理解

    描述 一个类应该专注于实现一个功能 好处 便于代码复用 举例 俄罗斯方块游戏 首先可以想到的是游戏逻辑与界面的分离 也就是说逻辑一个类 界面部分一个类 这样做的好处就是我们可以复用游戏逻辑的代码 例如我们用java写了一个基于PC端的俄罗斯
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • 设计模式之享元模式

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • 设计模式-建造者模式

    文章目录 建造者模式 创建复杂对象的优雅方式 什么是建造者模式 建造者模式的使用场景 优缺点 示例 使用建造者模式创建电脑对象 建造者模式 创建复杂对象的优雅方式 在软件开发中 有时候我们需要创建具有复杂结构和多个组件的对象 直接在客户端代
  • 设计模式(十)装饰器模式

    装饰器模式是一种非常有用的结构型模式 它允许我们在不改变类的结果的情况下 为类添加新的功能 我们来举例说明一下 首先添加一组形状 它们都实现了形状接口 public interface Shape String getShape class
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并

随机推荐

  • Mac如何读写NTFS硬盘,NTFSTool让Mac也可以轻松读写NTFS硬盘

    在了解Mac如何读写NTFS格式硬盘前 我们应该先了解什么是NTFS硬盘 以及Mac为什么不能对NTFS硬盘进行读写 一 什么是NTFS硬盘 NTFS格式硬盘最早出现于1993年的win NT操作系统中 作为一款日志文件系统 除了可以对硬盘
  • Java中 判断集合中的元素相等的依据 详细解析

    我们经常使用的集合如ArrayList LinkedList Vector 你在调用contains 方法的时候 或者是你在根据对象移除元素 remove Object o 你知道他们是如何判断集合中的元素是否 是相等的吗 接下来我们跟着源
  • 解决Linux MySQL报错ERROR 2002

    在Linux安装MySQL有时候会出现 mysql ERROR 2002 HY000 Can t connect to local MySQL server through socket var lib mysql mysql sock 2
  • Fority代码审计工具介绍

    Fortify SCA简介 Fortify SCA 是一个静态的 白盒的软件源代码安全测试工具 它通过内置的五大主要分析引擎 数据流 语义 结构 控制流 配置流等对应用软件的源代码进行静态的分析 分析的过程中与它特有的软件安全漏洞规则集进行
  • 速度教你创建网页文件,实现HTML入门

    今天 为大家准备了关于创建网页文件的学习内容 具体包括网页文件创建 HTML标签语法规范 HTML标签的关系以及HTML整体结构 完成以上内容的学习 零基础学习者基本上就能学会如何创建一个有简单内容的网页文件 快一起来看吧 1 网页文件的扩
  • Java常用包

    Java采用包结构来组织和管理类和接口文件 一 java lang包 该包提供了Java语言进行程序设计的基础类 它是默认导入的包 该包里面的Runnable接口和Object Math String StringBuffer System
  • Python中使用zlib库实现字符串的压缩和解压缩是一种常见的操作

    Python中使用zlib库实现字符串的压缩和解压缩是一种常见的操作 zlib库提供了一组函数 可以方便地对字符串进行压缩和解压缩操作 下面是一个详细的示例 展示了如何使用zlib库进行字符串的压缩和解压缩 首先 我们需要导入zlib库 i
  • C++模板的使用

    在平时的工作和学习过程中 经常会用到泛型 这里对泛型和模板进行一下梳理 以便理解和使用 模板关键字 template 为什么要使用模板 假如设计一个两个参数的函数 用来求两个对象的乘积 在实践中我们可能需要定义n多个函数 int multi
  • ETCD v3 restful api 使用详解

    ETCD v3 restful api 使用详解 网上已经有很多关于v2接口的使用了 类型下面的请求方式 本文就主要讲解v3版本的restful api的使用方式 V2版本 curl http 127 0 0 1 2379 v2 keys
  • C++语言基础--递归函数

    对于很多编程初学者来说 递归算法是学习语言的最大障碍之一 可能也有一大部分人知道递归 也能看的懂递归 但在实际做题过程中 却不知道怎么使用 递归的定义 1 很官方的说法 递归 在数学与计算机科学中 是指在函数的定义中使用函数自身的方法 也就
  • 机器学习集成模型学习——Boosting集成学习(四)

    Boosting Boosting模型是线性训练的 后面的模型会纠结于前一个模型预测错的部分 然后尝试把它修正 步骤如下 第一个模型用一部分训练集训练 得出这部分训练集上的错误点 错误的数据会有更大的概率被后续的模型选择 第二个模型再拿一部
  • Unbiased Teacher v2: Semi-supervised Object Detection for Anchor-free and Anchor-based Detectors

    摘要 随着最近半监督目标检测 SS OD 技术的发展 目标检测器可以通过使用有限的标记数据和丰富的未标记数据来改进 然而 仍有两个挑战没有解决 1 在无锚检测器上没有先期的SS OD工作 2 在伪标签边界框回归时 先期工作是无效的 在本文中
  • webpack学习

    前端工程化具体的解决方案 webpack 1 新建项目空白目录 文件夹地址栏cmd运行 npm init y 初始化包管理配置文件package json 2 新建src源代码目录 3 src下新建index html和index js 4
  • Java --- 堆空间大小设置与OutOfMemoryError(OOM)

    目录 一 堆空间大小设置 二 OutOfMemoryError异常 一 堆空间大小设置 1 Java堆区用于存储Java对象实例 那么堆的大小在JVM启动时就已经设定好了 大家可以通过选项 Xmx 和 Xms 来进行设置 Xms 用于表示堆
  • gorm的全部标签说明

    在 GORM 中 可以使用多种标签来控制模型结构体的行为和数据库列的属性 以下是一些常用的 GORM 标签 primaryKey 将字段设置为模型的主键 autoIncrement 将字段设置为自增长字段 unique 将字段设置为唯一的
  • Filter链,FilterConfig接口,Filter实现用户自动登录

    一 Filter链 在一个 Web 应用程序中可以注册多个 Filter 程序 每个 Filter 程序都可以针对某一个 URL 进行拦截 如果多个 Filter 程序都对同一个 URL 进行拦截 那么这些 Filter 就会组成一个 Fi
  • mongodb replica初始化

    use admin cfg id audit members id 0 host 10 96 91 192 17017 priority 2 id 1 host 10 96 91 192 27017 priority 1 id 2 host
  • VSCode中JS脚本的运行(控制台输出配置)

    F5开始调试 进入launch json中进行如下配置 使用 IntelliSense 了解相关属性 悬停以查看现有属性的描述 欲了解更多信息 请访问 https go microsoft com fwlink linkid 830387
  • node版本降级

    问题原因 因为node版本过高 导致npm install 或npm run dev报错 1 安装node版本管理模块 n sudo npm install n g 2 根据自己需要的安装版本 例如 安装稳定版本 sudo n stable
  • 设计模式之抽象工厂

    抽象工厂模式结构图 抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 工厂方法模式 定义一个用于创建对象的接口 让子类决定实例化哪一个类 抽象工厂模式是围绕一个超级工厂创建其他工厂 该超级工程又称为其他工厂的