C# 简单工厂模式(简单工厂模式如何工作)

在OO程序中,我们经常看到的一种模式就是简单工厂模式(SimpleFactoryPattem)。简单工

厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的

父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式

实际上不属于23个GoF模式,但它可以作为我们稍后要讨论的工厂方法模式的一个引导。

简单工厂模式如何工作

为了理解简单工厂模式,我们来看图8.1中的类图。在该图中,X是一个基类,XY类和XZ类

从它派生出来,类根据给出的参数决定返回哪一个子类。在右边定义了一个方法,

传递给它某个值(如abc),然后返回类X的某个实例。返回哪一个类的实例与程序员无关,因为这

些类有同样的方法,只是实现不同。返回哪一个类的实例完全取决于工厂,工厂功能可能很复杂,

但通常都是相当简单的。

示例代码

接下来考虑一个简单的C#例子,在它里面用到了Factory类。假设我们有一个输入窗体,允许

用户输入他的姓名,可以是"firstname lastname"形式或"lastname,firstname"形式。现在进一步

简化这个问题,假设我们总是能通过判断lastname和firstname之间是否有逗号来确定姓名的顺序。

这是一个相当容易做出的判断,可以在类中用一个简单的评语句实现,但是,我们这里是用它

说明工厂如何工作以及工厂能生成哪些对象。先定义一个简单的类,它用构造函数接收表示名字的

字符串,并且可以从类中取回名字。

csharp 复制代码
public class Namer
{
    protected string frName,lName;

    public string getFrname()
    {
        return frName;
    }

    public string getLname()
    {
        return _Name;
    }
}

注意,在这个基类里没有设置名序的构造函数。

两个派生类

接下来编写两个非常简单的派生类,它们实现了接口,并在构造函数中将名字分成了两部分。

在FirstFirst类中,做了一个简单的假设:最后一个空格前面的所有部分都属于firstname。

csharp 复制代码
public class FirstFirst:Namer{
    public FirstFirst(string name)
    {
        int i=name.Trim().IndexOf(" ");
        if(i>0)
        {
            frName=name.Substring(0,i).Trim();
            lName=name.Substring(i+1).Trim();
        }
        else
        {
            lName=name;
            frName="";
        }
    }
}

在LastFirst类里,用逗号给lastname划分界限。当空格或逗号不存在时,两个类里都提供了错

误校正处理。

csharp 复制代码
public class LastFirst:Namer
{
    public LastFirst(string name)
    {
        int i=name.IndexOf(",");
        if(i>0)
        {
            lName=name.Substring(0,i);
            frName=name.Substring(i+1).Trim();
        }
        else
        {
            lName=name;
            frName="";
        }
    }
}

两种情况下,我们把拆分后的名字分别保存在基类Namer中的保护变量和frName里。

注意,在派生类里根本不需要任何getFrname和getLname方法,因为已经在基类里给出来了。

相关推荐
Dovis(誓平步青云)3 分钟前
现场问题先关闭还是先验收,建筑任务怎样处理依赖
前端·javascript·数据库·mysql·音视频
用户84298142418107 分钟前
压缩 ≠ 加密:前端代码保护的三层实践与踩坑记录
前端·javascript
前端一课25 分钟前
别把人生过成一场等待退休的倒计时
前端
CENTER SAYS44 分钟前
企业400电话办理全流程详解与材料准备(实操向)
前端·crm
:mnong1 小时前
Web 三维可视化技术对比:ParaView Web vs 本项目 wasm + Three.js
前端·webgl·opengl·opencl·科学可视化
Shirley~~1 小时前
three.js的调试面板工具
前端·3d
怕浪猫1 小时前
12个UI组件库,Star最低的下载最多
前端·javascript·面试
溪语流沙1 小时前
【Web全栈进阶】Vue3起步:组件、模板语法、响应式数据
前端·javascript·vue.js·css3
众链网络1 小时前
Agent 重试的工程解法:幂等、断点续跑与熔断怎么落地
java·前端·数据库·人工智能
User_芊芊君子1 小时前
JiuwenSwarm 协同智能体落地金融投研全流程:SwarmFlow 工作流编排与人机交互面板实测(A2UI v0.8 Web 通道适配)
前端·金融·人机交互