首页 > 编程语言 >c#代码介绍23种设计模式_03工厂模式

c#代码介绍23种设计模式_03工厂模式

时间:2024-09-22 15:20:20浏览次数:3  
标签:03 23 创建 多态 模式 工厂 具体 产品 设计模式

目录

1. 工厂方法模式之所以可以解决简单工厂的模式

2. 使用工厂方法实现的系统,如果系统需要添加新产品时

3. 从UML图来看

4、实现思路


1. 工厂方法模式之所以可以解决简单工厂的模式

是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,
这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点

2. 使用工厂方法实现的系统,如果系统需要添加新产品时

我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类和肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现

3. 从UML图来看

在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:
Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类
TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品
Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类
TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。

工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)

继承:
在C#中,一个类只能有一个父类,C#和Java都不支持多继承。要想使用多继承,那么请您使用接口。
多态:
不同的对象对于同一个操作,做出的响应不同,那么这种情况在面向对象编程中就称为多态。多态的目的就是为了统一调用。可以通过虚方法实现多态

4、实现思路

个人理解(具体产品的创建从抽象工厂类推迟到工厂子类中):
1) Food => TomatoScrambledEggs(西红柿鸡蛋)
            -> override Print()
        => ShreddedPorkWithPotatoes(土豆肉丝)
            -> override Print()

2)Creator => TomatoScrambledEggsFactory(创建西红柿炒蛋的工厂类)
                 -> override CreateFoodFactory()
                       new TomatoScrambledEggs();  
           => ShreddedPorkWithPotatoesFactory(创建土豆肉丝的工厂类)
                 -> override CreateFoodFactory()
                       new ShreddedPorkWithPotatoes();

3)客户端调用
   1)初始化做菜的工厂
      Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
      Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
   2)开始做西红柿炒蛋
      Food tomatoScrambledEggs  = tomatoScrambledEggsFactory.CreateFoodFactory();
      tomatoScrambledEggs.Print();
      
      开始做土豆肉丝
      Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoodFactory();
      shreddedPorkWithPotatoes.Print();

标签:03,23,创建,多态,模式,工厂,具体,产品,设计模式
From: https://blog.csdn.net/soarfeng/article/details/142437613

相关文章

  • 【代码随想录Day24】回溯算法Part03
    93.复原IP地址题目链接/文章讲解:代码随想录视频讲解:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibiliclassSolution{List<String>result=newArrayList<>();LinkedList<String>path=newLinkedList<>();publicL......
  • shell中$后加引号有什么用($"string"和$'string')
    (1).如果没有特殊定制bash环境或有特殊需求,$"string"和"string"是完全等价的,使用$""只是为了保证本地化。以下是manbash关于$""的解释:Adouble-quotedstringprecededbyadollarsign($"string")willcausethestringtobetranslatedaccordi......
  • Can't connect to local MySQL server through socket
    mysql-urootERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)这是mysql登录时找不到套接字的问题。首先需要明白的是,Linux端的mysqlserver启动时会开启一个socket,Linux上的MySQL的客户端在不使用IP连接时mysqlserver时,默认......
  • LL学设计模式之最终章
    序学习过好多遍设计模式。感觉还是没学会。面试啥的又说不出来。这是最后一次了。忘了并不代表不会。知道个大概就行了为啥要学设计模式:1:阅读源代码的时候,知道是啥设计模式,就更容易看懂。2:为了写出好的容易扩展的代码。应对各种变化。简单。设计模式有指导原则。设计模式......
  • Provide the path to the executable if it can't be found by the app, shim executa
    Ifyourappcan'tfindtheNode.jsexecutable,andyoureceiveamessagesayingthat"shimexecutablesarenotsupported,"youwillneedtomanuallyprovidethefullpathtotheNode.jsexecutable.HerearethestepstofindtheNode.jsexe......
  • 第03章_流程控制语句
    流程控制语句:用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。顺序结构:程序从上到下逐行地执行,中间没有任何判断和跳转。分支结构:根据条件,选择性地执行某段代码。有if…else、switch-case两种分支语句。循环结构:根据循环条件,重复性的执行......
  • 【信号传输】DMA传输只能收到一半数据,发送123456 只能收到 123, 发送abcd只能收到ab,缓
    系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接5.板子调试6.程序设计7.算法学习8.编写exe9.检测标准10.项目举例11.职业规划文章目录方案一、改DMA中断方案二、改数据类型方案三、改数据长度后记方案一、改DMA中断每个DMA通道都可以在DMA传......
  • 基于SpringBoot的城市抢险救灾信息服务平台 毕业设计-附源码87303
    摘要:随着城市化进程的加快,城市灾害事件频繁发生,抢险救灾工作变得越来越重要。为了提高城市抢险救灾的效率和准确性,本文设计并实现了一个基于SpringBoot的城市抢险救灾信息服务平台。该平台采用微服务架构,实现了灾害信息的快速采集、传输、处理和分析,为抢险救灾工作提供了有......
  • CF 231 E Cactus 题解(仙人掌图上找环)
    codeforces提交记录题意有一个点仙人掌图(每个点都只属于至多一个简单环),给出kkk个询问,问点x......
  • 最新毕设-Node.js-游戏网站-031726(免费领项目)可做计算机毕业设计JAVA、PHP、爬虫、APP
    游戏网站的设计摘 要基于网络游戏的蓬勃发展,游戏网站发挥着吸引玩家和提高玩家之间的互动性的重要作用,因而,建设了一个以游戏为中心的游戏官网。 该游戏提供了一个大型的玩家交流互动平台,包括用户管理、游戏社区、游戏信息、分类信息、游戏资讯、论坛分类列表、新闻分类列......