【设计模式】工厂方法模式(C#)

2023-10-26

【设计模式】工厂方法模式

1、概述

针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

工厂方法模式的主要角色:

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

2、工厂方法模式实现思路

首先,我们先创建一个简单的类。

//1.抽象产品类
public abstract class Pizza
    {
        //名字
        public string Name;

        //准备原材料
        public abstract void Prepare();

        public void Bake()
        {
            Console.WriteLine($"{this.Name} bake");
        }

        public void Cut()
        {
            Console.WriteLine($"{this.Name} cut");
        }

        public void Box()
        {
            Console.WriteLine($"{this.Name} box");
        }

    }

//2.具体产品类
public class GreekPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("GreekPizza 准备原材料");
        }
    }

//2.具体产品类
public class CheessPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("CheessPizza 准备原材料");
        }
    }

//3.抽象工厂类
public abstract class PizzaFactory
    {
       public abstract Pizza CreatePizza();
    }

//4.具体工厂类
public class CheessPizzaFactory : PizzaFactory
    {
        public override Pizza CreatePizza()
        {
            CheessPizza cheessPizza = new CheessPizza();
            cheessPizza.Name = "奶酪披萨";
            cheessPizza.Prepare();
            cheessPizza.Bake();
            cheessPizza.Cut();
            cheessPizza.Box();
            return cheessPizza;
        }
    }
//4.具体工厂类
public class GreekPizzaFactory:PizzaFactory
    {
        public override Pizza CreatePizza()
        {
            GreekPizza greekPizza = new GreekPizza();
            greekPizza.Name = "希腊披萨";
            greekPizza.Prepare();
            greekPizza.Bake();
            greekPizza.Cut();
            greekPizza.Box();
            return greekPizza;
        }
    }

//5.订购披萨
    public class PizzaStore
    {
        PizzaFactory _pizzaFactory;
        public void setPizzaFactory(PizzaFactory pizzaFactory)
        {
            this._pizzaFactory = pizzaFactory;
        }
        public Pizza OrderPizza()
        {
            Pizza pizza = _pizzaFactory.CreatePizza();
            return pizza;
        }
    }

//使用工厂方法模式
class Program
    {
        static void Main(string[] args)
        {
            PizzaStore pizzaStore = new PizzaStore();
            PizzaFactory greekPizzaFactory = new GreekPizzaFactory();
            pizzaStore.setPizzaFactory(greekPizzaFactory);
            pizzaStore.OrderPizza();

            PizzaFactory cheessPizzaFactory = new CheessPizzaFactory();
            pizzaStore.setPizzaFactory(cheessPizzaFactory);
            pizzaStore.OrderPizza();
        }
    }

******************【运行结果】******************
GreekPizza 准备原材料
希腊披萨 bake
希腊披萨 cut
希腊披萨 box
CheessPizza 准备原材料
奶酪披萨 bake
奶酪披萨 cut
奶酪披萨 box

从以上的编写的代码可以看到,要增加产品类时也要相应地增加工厂类,不需要修改工厂类的代码了,这样就解决了简单工厂模式的缺点。

工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

3、 优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【设计模式】工厂方法模式(C#) 的相关文章

随机推荐

  • 模版之AnyType

    title 模版之AnyType date 2023 02 19 21 49 53 permalink pages 54a0bf categories 通用领域 编程语言 C tags C 元编程 author name zhengzhib
  • Java里NonNull和NotNull

    https blog csdn net yangyangrenren article details 121180269 lombok NonNull 这个 annotation 是 lombok 提供的 根据官方的解释可以看出它是用来辅助
  • 华为OD机试 - 组成最大数(Java)

    题目描述 小组中每位都有一张卡片 卡片上是6位内的正整数 将卡片连起来可以组成多种数字 计算组成的最大数字 输入描述 号分割的多个正整数字符串 不需要考虑非数字异常情况 小组最多25个人 输出描述 最大的数字字符串 用例 输入 22 221
  • Pycharm 交互式Console BUG问题解决 - OSError: [Errno 22] Invalid argument: ‘D:\pyCHram\<input>‘

    引言 Pycharm python console是一个很好用的交互式编程栏 但是在跑一些深度学习模型的时候 偶尔会发生类似于这种错误的报错 导致无法在交互式的Python console模式下运行测试代码 Pycharm 问题解决 OSE
  • 攻防世界NewsCenter思路

    打开环境后发现是这样一个页面 考虑到xss或者sql注入 尝试了alert无果 便试试sql注入 随便输入aaa后使用burp抓包 将这些保存在1 txt里 用sqlmap抓包 命令 sqlmap py r 1 txt dbs 这里看到一个
  • U-Boot相关命令开发板烧写问题及解决方案

    前言 最近在学习u boot命令在开发板的烧写 在进行该实验的过程中 出现了很多问题和错误 在这里我根据自己的开发历程 将我出现的几大问题进行了汇总 并附有相关解决办法 这些解决方案都经过我亲自验证有效 希望能让大家在开发过程中有所启发 问
  • C++实现复化梯形公式求积分算法

    1 算法原理简介 步1 将积分区间2n等分 步2 调用复化梯形公式 2 应用实例 取 n 10 利用复化梯形公式计算积分 3 程序代码 include
  • BLDC无刷直流电机驱动电路-硬石电子

    1 BLDC无刷直流电机驱动电路 因为BLDC是三相完全一样的驱动电路 下图为其中一相电路图 其他两相完全一样 主要元器件 高速光耦 TLP715 MOS管驱动IC IR2110S MOS IRF540NS D7和C13为自举电路 2 霍尔
  • ubuntu18.04安装之后没有网络,不显示网络图标

    新安装的ubuntu18 04 06安装完成后插着网线 但是没有有线网 桌面上不显示网络图标 原因是因为ubuntu系统安装时自带的网卡驱动不兼容导致的 下面来讲解解决方法 首先 先试用手机连接线 将手机连接到电脑usb口 使用手机上的US
  • matlab中hash和map的用法总结

    若要在matlab中使用hash 有两种方式 1 采用matlab官方给出的结构类型map containers Map http cn mathworks com help matlab map containers html 2 调用J
  • 到底要不要孩子学习机器人编程

    人工智能发展迅猛 很多技术已经成熟应用到我们生活场景中 如果再不从小让孩子学习机器人编程教育 掌握更多编程语言 那未来就out啦 格物斯坦小坦克可以告诉你关于机器人编程要不要学的答案 教育部也将启动中小学生信息素养测评 并推动在中小学阶段设
  • uni-app利用chooseImage方法封装一个图片选择组件

    效果如图 可以预览 长按可删除 可以设置最多上传数量 这里封装的组件有个MaxNumber number类型 用的时候在父组件传就行了 这里默认给的8 废话不多说直接上代码 封装好了之后我们用的时候只需要引入直接用就行
  • 从etcd看Raft协议

    首先 什么是etcd 看官方的定义 A highly available key value store for shared configuration and service discovery 翻译过来就是 用于配置共享和服务发现的K
  • 动态规划(五)

    01背包问题 01 Knapsack problem 有10件货物要从甲地运送到乙地 每件货物的重量 单位 吨 和利润 单位 元 如下表所示 由于只有一辆最大载重为30t的货车能用来运送货物 所以只能选择部分货物配送 要求确定运送哪些货物
  • 如何快速画AltiumDesigner封装——用Ultralibrarian生成库文件---官网最新打开方式

    如何用Ultralibrarian生成库文件 官网最新打开方式 步骤1 下载元器件 步骤2 AltiumDesigner生成库文件 Ultralibrarian软件比较常用的生成库文件的软件 网上对于它的介绍大多还停留在软件使用层面上 但官
  • 区块链的工作流程

    工作流程 通过前两篇文章 相信大家对区块链有了基本的认识 区块链系统有很多种 第一个应用区块链的软件就是比特币 事实上区块链就是比特币带出来的 到现在为止 已经出现很多基于区块链的系统了 比如超级账本 以太坊等 每一类系统都有自己的特点 无
  • 雪花算法生成ID

    雪花算法生成ID Snowflake 雪花算法是由Twitter开源的分布式ID生成算法 以划分命名空间的方式将64 bit位分割成多个部分 每个部分代表不同的含义 而Java中64bit的整数是Long类型 所以在Java中 SnowFl
  • [网络安全]sqli-labs Less-2 解题详析

    网络安全 Less 2 GET Error based Intiger based 基于错误的GET整型注入 判断注入类型 判断注入点个数 查库名 查表名 查users表的列名 查字段 注意 总结 往期回顾 网络安全 sqli labs L
  • TensorRT简介

    一 什么是TensorRT 一般的深度学习项目 训练时为了加快速度 会使用多 GPU 分布式训练 但在部署推理时 为了降低成本 往往使用单个 GPU 机器甚至嵌入式平台 比如 NVIDIA Jetson 进行部署 部署端也要有与训练时相同的
  • 【设计模式】工厂方法模式(C#)

    设计模式 工厂方法模式 1 概述 针对简单工厂中的缺点 使用工厂方法模式就可以完美的解决 完全遵循开闭原则 定义一个用于创建对象的接口 让子类决定实例化哪个产品类对象 工厂方法使一个产品类的实例化延迟到其工厂的子类 工厂方法模式的主要角色