C# —— 简单工厂设计模式详述

一、基本概念

众所周知,C#是一种面向对象的语言,而其中封装,继承,多态是面向对象的三大重要特征,简单工厂的设计模式则可以完全体现这些特征。要彻底理解这个模式,必须要先将封装(访问修饰符的应用)、继承(基类和派生类的概念)、多态(重载,虚方法,重写,抽象方法的概念)全部搞懂,并能灵活运用。

1.简单工厂模式定义

简单工厂模式简单来说就是创建一个工厂类,通过输入的参数创建对象赋值给基类,完成对想要的派生类的调用,从而达成目标,具体的操作均在子类中完成,工厂类只负责运算逻辑和给基类赋值。该模式有三部分:
1、工厂类:实现创建所有实例的选择类型,被外界调用的接口。
2、抽象类:所要创建的类的基类,描述类所有实例所共有的公共接口(方法),可以是抽象类也可是接口类型(interface),本例是抽象类。
3、具体类:所有要创建的具体实例对象。
为什么要用简单工厂模式来做呢?按照我的理解,原因如下:
通常需要面对的对象会有很多,这就会有很多类产生,而要调用类的对象需要对类进行实例化,大家想一下,如果每个类都在主函数内进行实例化,那需要写很多的代码,所以需要通过多态的方法来实现,另外通过工厂类的方法完成对子类对象的实例化,也就是给基类赋值,从而调用子类方法。

二、举例

比如去吃饭的时候,你想问某个饭还有多长时间做好,还想了解下菜谱,可供选择的类型有很多,像黄焖鸡米饭,河南烩面,饺子等等,那如果想“随便”喊一个饭的名称就能得到回答,就需要通过工厂模式实现。
首先,要先创建一个抽象类,将所有的饭的类型统称为"Food",类里面创建一个或多个抽象方法。注意,如果基类为抽象类,子类必须重写,这也是为什么创建抽象基类的原因,可以任意在子类方法里上面实现想要的效果。

    public abstract class Food{public abstract void Ask();public abstract void Menu();}

然后,创建所有的子类,具体到每个饭。

public class Rice : Food{public override void Ask(){Console.WriteLine("黄焖鸡米饭正在制作中,还需1分钟");}public override void Menu(){Console.WriteLine("鸡,米,油,盐,酱油,海带丝,香菇,辣椒");}}public class Noodles: Food{public override void Ask(){Console.WriteLine("河南烩面正在制作中,还需1小时");}public override void Menu(){Console.WriteLine("面,羊肉汤,葱花,盐");}}public class Dumplings : Food{public override void Ask(){Console.WriteLine("饺子正在制作中,还需1天");}public override void Menu(){Console.WriteLine("韭菜,鸡蛋,油,盐");}}

然后,核心的部分来了,创建工厂类要实施的方法,其格式为:访问修饰符+静态关键字+基类名+方法名(参数名),这样就可以实现子类给基类赋值的功能。

       //简单工厂的核心,根据用户的输入创建对象赋值给父类public static class 老高饭庄{public static Food Cook(string Foodname){Food f = null;switch (Foodname){case "黄焖鸡米饭":f = new Rice();break;case "河南烩面":f = new Noodles();break;case "韭菜鸡蛋饺子":f = new Dumplings();break;default:break;}return f;}}

最后,在主函数中对工厂类实例化,我们可以看到,通过工厂类可以实现对任意子类的调用。

 static void Main(string[] args){Console.WriteLine("请输入菜名:");string Foodname = Console.ReadLine();Food f = 老高饭庄.Cook(Foodname);f.Ask();f.Menu();Console.ReadKey();}

程序显示
在这里插入图片描述

三、总结

这种模式的优点在于可以只通过参数即可完成对任意子类对象的调用,而且便于扩展。缺点也很明显,如果要增加一个类,那我必须要更改工厂类才能完成,违反开闭原则(一个软件实体应当对扩展开放,对修改封闭)。
先这样写,后面持续更新。

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

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

相关文章

【计算机视觉】计算机视觉、模式识别、机器学习常用牛人主页链接

计算机视觉、模式识别、机器学习常用牛人主页链接 牛人主页(主页有很多论文代码) Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager类引用方法

c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行的。 后来终于找到一个解决方法,就是在解决方案资源管理器里找到类文件选择…

机器学习——支持向量机SVM之python实现简单实例一(含数据预处理、交叉验证、参数优化等)

目录 一、SVM理论 二、numpy的相关函数介绍 三、python实现之准备 1、数据集的下载

工业相机常用类型详述

一、工业相机定义 工业相机是应用于工业领域、安防和交通等对相机要求较高领域的摄像机,功能就是将光信号转变成有序的电信号,此信号经过模数转换为数字信号,然后传递给图像处理器。与一般的家用相机相比,其具有更高的稳定性能&a…

机器学习——SVM之python实现数据样本标准化和归一化

目录 一、标准化和归一化的目的 1、标准化 2、归一化 二、标准化和归一化常用的理论公式 1、归一化 2、标准化 三、python实现SVM样本数据标准化和归一化 1、标准化 2、归一化 本文源代码:《机器学习——支持向量机SVM之python实现简单实例一》 一、标准化…

[黑群晖经典教程] 一步一步建立自己的黑群晖

【申明:本文并非本人所作,为内部网络中一位大神所写,个人觉得写得很好,遂原文搬了过来,如有侵犯原作者的权利,请及时与我联系】 PS:有好几个兄弟觉得我擅自转发,不是很妥。解释一下:…

Java为什么能跨平台运行

因为java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”--字节码。不同的硬件平台上装有不同的java虚拟机(JVM),由JVM来把字节码再翻译成所对应的硬件平台能够执行的代码,因此java可以跨平台运…

C++和Opencv4.5 实现全景图像拼接

前言 最近刚下了最新版的opencv4.5,急不可待的试下操作,就用了opencv自带的Stitcher类拼接下图像,结果傻眼了,程序显示Stitcher没有createDefault成员,看了好久,终于找到了解决方法。 Stitcher原理 Stit…

机器学习——python实现SVM模型w,b的查看

基于源代码:《机器学习——支持向量机SVM之python实现简单实例一》进行讲解 1、线性模型 这里以二特征三类,一对多策略为案例 kernel “linear”:线性核,参数有w,b 线性模型的决策边界是:w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

转载于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移动端输入框弹出键盘控制

在移动端,我们公司通过输入框主要收集用户的姓名和电话,以下是对输入框获取焦点时,控制弹出键盘的样式来增强用户体验。 输入姓名 我们的用户都是中国人,输入用户名为中文,所以弹出键盘是输入中文状态即可,…

Opencv4.5-C++ 摄像头画面镜像显示及文件保存

前言 想试下新买电脑的摄像头好用不&#xff0c;就写了个摄像头调用程序&#xff0c;实现了镜像和图片截取保存。 代码 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

目录 一、ROC曲线 二、TP、FP、TN、FN 三、 python绘制ROC曲线(二分类) 1、思路 2、关键代码

easyui datagrid 列拖动

实现代码-code <script type"text/javascript"> $.extend($.fn.datagrid.methods, { columnMoving: function(jq) { return jq.each(function() { var target this; var cells $(this).datagrid(getPanel).find(div.datagrid-header td[field]); cells.dragg…

window linux IPC ftok BY_HANDLE_FILE_INFORMATION

看这题目就很乱&#xff0c;心情当然也是不怎么美好了。前一段时间做了一个项目&#xff0c;AIX(Unix的一种&#xff09;中的一个系统向WINDOWS移植&#xff0c;开发环境由IBM的C/C(叫什么忘记了&#xff0c;好像是xlC)变为VC。 这是算过来&#xff0c;但是最近进程通信的信号量…

相机标定(一) —— 深入理解齐次坐标及其作用

一、什么是齐次坐标和齐次坐标系 齐次坐标 齐次坐标是一个相机标定问题的关键理论之一&#xff0c;所以就此问题分析一下。 单从定义上来讲&#xff0c;齐次坐标&#xff08;投影坐标&#xff09;就是用N1维来代表N维坐标&#xff08;点和向量&#xff09;&#xff0c;也可说…

机器学习——图解SVM中gamma和c参数的作用

参数c和gamma的作用 我们通过下图详解参数c的作用&#xff0c;首先我们以一个简单的线性分类器为例&#xff0c;上一个博客中我们知道影响分类器的主要因素是支持向量&#xff0c;即虚线上的样本&#xff0c;如下图可知&#xff1a; 但当正负样本的分布在如下情况时&#xff0…

关于结构体里面结构体的申明和使用

申请&#xff1a; typedef struct Vo{int Voltage;float Delay_ms;char Enable;}Volt_Def;typedef struct ed{float Delay_ms;int Level;}Edge_Def;typedef struct Ed_hard{Edge_Def a;Edge_Def b;Edge_Def c;}HARD_RESET;int power_sel 0xff;typedef struct power_x{Volt_Def…

面试题(十四)

唐巧前辈说这些都是 iOS 的基础问题&#xff0c;应该对此深入的了解。当初看到时&#xff0c;大部分回答不上来&#xff0c;因为平时没有好好思考整理过。这里大部分的概念大多会在学习 OC 的过程中遇到过&#xff0c;但还是得经过写代码才能有更深的理解。反正我当初看那些设计…

工业相机基础知识详述 —— 焦平面,像平面,弥散圆,光圈,分辨率,景深,接口,靶面尺寸

一、焦平面 想到焦平面&#xff0c;很多人不由自主就想到不就是焦点所在的垂直于光轴的平面吗&#xff1f;其实其背后隐藏这更多的东西。 1&#xff09;焦点不止一个 对于一般拍摄场景来说&#xff0c;光通过一个凸透镜&#xff0c;汇聚不到一个点&#xff0c;越靠近中轴线的…