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,一经查实,立即删除!

相关文章

工业相机常用类型详述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

面试题(十四)

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

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

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

相机标定(二)深入理解四大坐标系与其变换关系

一、前言 视觉系统一共有四个坐标系:像素平面坐标系(u,v)、图像坐标系(x,y)、相机坐标系(Xc,Yc,Zc)和世界坐标系(Xw,Yw,Zw),如下图所示。每种坐标系之间均存…

相机标定(三) —— 畸变校正

一、前言 根据针孔模型,物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因,导致这种关系无法成立,使理想成像与实际成像存在误差,这种误差即称为畸变。 畸变分为径向畸变,切向畸变和…

SVG技术入门:线条动画实现原理

相信大家都见到过这样神奇的技术:一副线条构成的画能自动画出自己。非常的酷。Jake Archibald是这种SVG技术的首创者,并且写了一篇非常好的文章来描述它是如何实现的。Brian Suda也在24 Ways网站上讨论过它。 Polygon使用它在一篇设计方面的文章里创造出…

机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3、神经网络数学模型定义 1)激活函数 ​ 2)各层权重、阈值定义 3)各层输入输…

Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

一、前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕,为什么要标定以及标定要求出什么参数呢,用一个Halcon 例程来帮助理解。 这个例程是比较经典的标定程序,基本将标定过程讲的比较清楚,用的标定图像是系统自…

SkipList 跳表

为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树…

机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构

目录 一、卷积神经网络 1、卷积神经的作用 2、LeNet 1)数据库准备——minst 2)模型 二、关于卷积神经网络结构的一些术语定义 1、特征图(Feature map) 2、height(长度)、width(宽度&…

工业相机(3D)主要参数详述

一、前言 准确的完成相机选型是一个视觉工程师必备的技能,而选型前必须对其内部参数了如指掌。工业相机是一种比较复杂的产品,其参数很多,每个参数可能会有不同的标准,下面对主要的参数会做比较详细的阐述。 二、参数详述 2.1 …

JAVA8永久代

在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表…

Struts 2初体验

Struts2简介: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。 Struts 2 目录结构:     apps目录:Struts2示例…