设计模式--简单工厂(个人笔记)

一、适用场景以及优缺点

    1.适用场景:

      当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式,

      客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式

    2.优点:

      解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。

      起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。

    3.缺点

      工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响

      系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

二、代码

      也就是将变化的代码写入到一个类里面,这个类就是简单工厂类,也就是简单工厂的原理。

    

 public ActionResult SimapleFactory(){// 客户想点一个西红柿炒蛋        Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");food1.Print();// 客户想点一个土豆肉丝Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");food2.Print();return View();}

  

/// <summary>/// 菜抽象类/// </summary>public abstract class Food{// 输出点了什么菜public abstract void Print();}/// <summary>/// 西红柿炒鸡蛋这道菜/// </summary>public class TomatoScrambledEggs : Food{public override void Print(){Console.WriteLine("一份西红柿炒蛋!");}}/// <summary>/// 土豆肉丝这道菜/// </summary>public class ShreddedPorkWithPotatoes : Food{public override void Print(){Console.WriteLine("一份土豆肉丝");}}/// <summary>/// 简单工厂类, 负责 炒菜/// </summary>public class FoodSimpleFactory{public static Food CreateFood(string type){Food food = null;if (type.Equals("土豆肉丝")){food = new ShreddedPorkWithPotatoes();}else if (type.Equals("西红柿炒蛋")){food = new TomatoScrambledEggs();}return food;}}

  此时,如果有个客户想要吃蛋炒饭,就需要在简单工厂类中加上蛋炒饭,并且新建一个继承于Food的蛋炒饭(EggAndRice)类

代码如下:

      

 /// <summary>/// 简单工厂类, 负责 炒菜/// </summary>public class FoodSimpleFactory{public static Food CreateFood(string type){Food food = null;if (type.Equals("土豆肉丝")){food = new ShreddedPorkWithPotatoes();}else if (type.Equals("西红柿炒蛋")){food = new TomatoScrambledEggs();}else if (type.Equals("蛋炒饭")){food = new EggAndRice();}return food;}}/// <summary>/// 蛋炒饭这道菜/// </summary>public class EggAndRice : Food{public override void Print(){Console.WriteLine("一份蛋炒饭");}}

   因此,简单工厂扩展起来相对麻烦些,在写代码时需要根据自己的需要选择设计模式,切勿适得其反。

 

 

 

     

转载于:https://www.cnblogs.com/BounceGuo/p/10183363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux RTC 驱动实验

目录Linux 内核RTC 驱动简介I.MX6U 内部RTC 驱动分析RTC 时间查看与设置RTC 也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于Linux 系统而言时间是非常重要的&#xff0c;就和我们使用Windows 电脑或手机查看时间一样&#xff0c;我们在使用Linux 设备的时候也…

opencv及相机相关6

下午调试了下&#xff0c;现在可以实现在arm板上打开相机并实时显示&#xff0c;但是人脸检测暂时还没有实现&#xff0c;猜想是因为opencv的原因。明天接着调试。今天整明白一件事&#xff0c;首先在linux系统下&#xff0c;g编译器当cpp文件较少时&#xff0c;编译程序时需要…

网络IPC:套接字之建立连接

如果处理的是面向连接的网络服务&#xff08;SOCK_STREAM或SOCK_SEQPACKET&#xff09;&#xff0c;在开始交换数据以前&#xff0c;需要在请求服务的进程套接字&#xff08;客户端&#xff09;和提供服务的进程套接字&#xff08;服务器&#xff09;之间建立一个连接。客户端可…

Linux I2C 驱动实验

目录Linux I2C 驱动框架简介I2C 总线驱动I2C 设备驱动I2C 设备和驱动匹配过程I.MX6U 的I2C 适配器驱动分析I2C 设备驱动编写流程I2C 设备信息描述I2C 设备数据收发处理流程硬件原理图分析实验程序编写修改设备树AP3216C 驱动编写编写测试APP运行测试编译驱动程序和测试APP运行测…

Min_25 筛小结

Min_25 筛这个东西&#xff0c;完全理解花了我很长的时间&#xff0c;所以写点东西来记录一些自己的理解。 它能做什么 对于某个数论函数 \(f\)&#xff0c;如果满足以下几个条件&#xff0c;那么它就可以用 Min_25 筛来快速求出这个函数的前缀和。 它是一个积性函数对于一个质…

【转】logback 常用配置详解(序)logback 简介

原创文章&#xff0c;转载请指明出处&#xff1a;http://aub.iteye.com/blog/1101222&#xff0c; 尊重他人即尊重自己 详细整理了logback常用配置&#xff0c; 不是官网手册的翻译版&#xff0c;而是使用总结&#xff0c;旨在更快更透彻的理解其配置 logback 常用配置详解&…

Linux curl 命令

curl is a tool to transfer data from or to a server, using one of the supported protocols ( http &#xff0c;https &#xff0c;ftp &#xff0c;telnet &#xff0c;...... ) [rootlocalhost ~]$ curl http://www.baidu.com/ # 获取指定页面&#xf…

vmware克隆Centos6.4虚拟机网卡无法启动问题

快速处理办法&#xff1a;cat /etc/sysconfig/network-scripts/ifcfg-eth0sed -i /UUID/d /etc/sysconfig/network-scripts/ifcfg-eth0sed -i /HWADDR/d /etc/sysconfig/network-scripts/ifcfg-eth0>/etc/udev/rules.d/70-persistent-net.rules rebootvmware克隆Centos6.4虚…

NXP(I.MX6uLL)DDR3实验——DDR3重要时间参数、时钟配置与原理图简析

目录DDR3 内存时间参数传输速率tRCD 参数CL 参数AL 参数tRC 参数tRAS 参数I.MX6U MMDC内存控制器简介MMDC内存控制器简介MMDC内存控制器信号引脚MMDC内存控制器时钟源ALPHA开发板核心板DDR3L原理图DDR3 内存时间参数 大家在购买DDR3 内存的时候通常会重点观察几个常用的时间参…

[elk]elasticsearch dsl语句

例子1 统计1&#xff0c;有唱歌兴趣的 2&#xff0c;按年龄分组 3&#xff0c;求每组平均年龄 4,按平均年龄降序排序 sql转为dsl例子 # 每种型号车的颜色数 > 1的 SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDE…

编写atoi库函数

看到很多面试书和博客都提到编写atoi函数&#xff0c;在很多面试中面试官都会要求应聘者当场写出atoi函数的实现代码&#xff0c;但基本很少人能写的完全正确&#xff0c;倒不是这道题有多么高深的算法&#xff0c;有多么复杂的数据结构&#xff0c;只因为这道题要考虑的情况比…

NXP(I.MX6uLL)DDR3实验——DDR3初始化、校准、超频测试

DDR3L 初始化与测试ddr_stress_tester简介(DDR压力测试工具)DDR3L驱动配置DDR3L校准DDR3L超频测试DDR3L驱动总结ddr_stress_tester简介(DDR压力测试工具) NXP 提供了一个非常好用的DDR 初始化工具&#xff0c;叫做ddr_stress_tester。此工具已经放到了开发板光盘中&#xff0c…

Git 初识

Git是什么&#xff1f; Git(读音为/gɪt/。)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一…

RGBLCD显示实验————复习到这

目录LCD 和eLCDIF 简介LCD 简介eLCDIF 接口硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载LCD 液晶屏是常用到的外设&#xff0c;通过LCD 可以显示绚丽的图形、界面等&#xff0c;提高人机交互的效率。I.MX6U 提供了一个eLCDIF 接口用于连接RGB 接口的液…

std::shared_ptr

在std::shared_ptr被引入之前&#xff0c;C标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已。std::auto_ptr的作用非常有限&#xff0c;因为它存在被管理资源的所有权转移问题。这导致多个std::auto_ptr类型的局部变量不能共享同一个资源&#xff0c;这个问题是…

unity 里调试native code

因项目需要&#xff0c;需要调试dll工程代码。 把生成的debug dll和pdb拷贝进unity的plugins工程&#xff0c;遇到 断点无法进入&#xff0c;修改下调试信息格式&#xff0c;OK。 转载于:https://www.cnblogs.com/marcher/p/10191521.html

将自己写的windows服务加入到windows集群中

最近发现windows集群能进行很多自定义&#xff0c;比如在集群中加入自己编写的服务。 能自定义的可不少&#xff0c;截个图&#xff1a; 本次演示中&#xff0c;只想用“通用服务”这个类型。 先列下步骤编写一个记录时间的Windows服务&#xff0c;这个服务会每隔1秒钟写入本地…

RTC实时时钟实验(低功耗、纽扣电池供电)

目录I.MX6U RTC 简介硬件原理分析实验程序编写修改文件MCIMX6Y2.h编写实验程序编译下载验证编写Makefile 和链接脚本编译下载实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟&#xff0c;可…

Python(21)_input用户交互

name input("请输入你的名字&#xff1a;") age input("请输入你的年龄&#xff1a;") print("我的名字是&#xff1a;"name" 年龄是&#xff1a;"age) #print(name) #print(age) 这是在本地调试的结果。因为程序是在远程服务器上执…

多点电容触摸屏实验

目录多点电容触摸简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载随着智能手机的发展&#xff0c;电容触摸屏也得到了飞速的发展。相比电阻触摸屏&#xff0c;电容触摸屏有很多的优势&#xff0c;比如支持多点触控、不需要按压&#xff0c;只需要轻轻…